四十六、django配置及增删改查
路由访问:
如果不加斜杠 会内部自动加上,如果加上还没有会报错(内部会自动重定向)
静态文件配置:
所有的静态文件(css,js,前端第三方类库)默认都放在static文件夹下
STATIC_URL = '/static/' # static 接口前缀 跟你静态文件夹的名字一点关系都没有 # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), # static这个是静态文件夹,本地文件名 os.path.join(BASE_DIR, "static1"), os.path.join(BASE_DIR, "static2") ] ps:会依次查找列表所有的静态文件路径 找到的话立刻停止,都没有找到才会报错返回404 一般http://127.0.0.1:8080/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js xxx表示接口,后面是路径,会依次查找静态配置文件的本地文件夹,去寻找信息
静态文件接口前缀"动态解析" {% load static %} 优点:如果接口改了,不需要改标签文件路劲 <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
form表单触发提交数据的动作两种方式
<input type="submit"> <button></button>
form 提交数据的地址如何指定及方式
action属性控制提交的地址
方式: 1.全路径 <form action="http://127.0.0.1:8080/login/"> 2.只写路径后缀 <form action="/login/"> #加上//会自动加上127.0.0.1:8080 3.不写默认往当前页面提交
form 表单默认是get请求(向服务端获取数据),post(向服务端发送请求)
<form action="" method="post">
根据客户端请求方式不同执行不同的代码逻辑:
可以分别执行get和post请求
1.第一种方式:
def login(request): # 获取用户端提交的请求方式 print(request.method) # 默认拿到的请求方式是大写的字符串 if request.method =="GET": return render(request,"login.html") elif request.method =="POST": return HttpResponse("服务器收到数据了")
2.第二种方式:( 推荐使用)
if request.method =="POST": return HttpResponse("服务器收到数据了") return render(request,"login.html") # 推荐使用
POST请求(向服务端发送数据):
if request.method == "POST": # print(request) #<WSGIRequest: POST '/login/'> print(request.POST) # <QueryDict: {'username': ['kevin'], 'password': ['123']}> print(request.POST.get("username")) # kevin values虽然是一个列表但是获取value的时候拿到却是单个元素 # 默认取最后一个 print(request.POST.getlist("username")) # 要想一次性取values里面所有数据需要用getlist print(request.POST["password"]) # 123 不推荐使用这种方法 return HttpResponse("服务器收到数据了") return render(request, "login.html")
获取用户value列表里面所偶遇元素需要用到getlist 应用场景:用户的爱好 多选框
.get只会获取到value列表最后一个数据
GET请求(获取服务端数据):
print(request.GET) ## <QueryDict: {'username': ['kevin'], 'password': ['123']} # 获取get请求数据和POST方式一模一样 request.POST.get("username") 取单个 request.POST.getlist("username") 取多个
Django连接数据库
1.需要修改配置文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "day41", "HOST": "127.0.0.1", "PORT": 3306, "USER": "root", "PASSWORD": "123456" } } PS:默认键必须大写
2.告诉Django用pymysql替换它默认mysql_db模块连接数据库
方式1.在你的项目文件夹(migrations)下面的__init__.py
方式2.也可以在你的应用名(app01)文件夹下__init__.py
# 固定写法
import pymysql
pymysql.install_as_MySQLdb() # 告诉Django用pymysql代替mysqldb连接数据库
django的orm:
对象关系映射:
类:表
对象:表记录
对象的属性:一条记录某个字段的值
django的orm不能帮你创建库,但是可以帮你创建表
提示:一个django项目使用一个库
数据库迁移命令(********)
python36 manage.py makemigrations (仅仅只是记录,不会创建表)将你的数据库变动记录到小本本上
python36 manage.py migrate 将你的数据变动记录同步到数据库中
django操作数据库增删改查
1.新增数据:
# 方式一: user_obj =models.User.objects.create(name=username,password=password) # 返回值是当前字段对象 # 方式二: user_obj = models.User(name=username, password=password) user_obj.save() # 对象调用save方法保存数据库 print(user_obj) print(user_obj.pk) # 获取主键(在不知道主键情况下可以使用) print(user_obj.id) # 获取主键 print(user_obj.name) # 获取name值 print(user_obj.password) # 获取password值
2.查询数据:
print(user_list.query) 可以查看内部执行的sql语句,只要是Queryset对象就可以查询sql语句 user_list = models.User.objects.all() 查询user表所有sql数据 利用a标签href属性 可以指定页面跳转的路径 href可以写全路径 但推荐写后缀即可 <a href="/reg/" class="btn btn-success">添加数据</a> # 路径属性一定要加上/ / ps:视图函数必须返回一个HttpResponse对象 重定向 可以写别人的网址也可以写服务端网址 return redirect("/userlist") # 内部重定向
3.删除数据:
#在跳转标签里把用户id一起发送过来 <a href="/delete_user/?delete_id={{ user.id }}" class="btn btn-danger ">删除</a> 删除: models.User.objects.filter(id=delete_id).delete() queryset对象支持索引取值 但是不推荐你使用 推荐使用自带.first() 查询方式一: models.User.objects.filter(id=delete_id).first() 取出第一个,里面是一个列表对象,如果没有,会返回一个空对象,推荐使用 查询方式二: user_obj = models.User.objects.get(id=edit_id) # 用get可以直接获取,不推荐 如果没有会报错
4.编辑:
编辑对象的id获取方式
方式一:利用input隐藏一个标签
<input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
方式二:直接写在form标签里携带过来,是get请求
<form action="/edit/?edit_id={{user_obj.pk}}" method="post">
更新:
第一种:
models.User.objects.filter(id=user_id).update(name=user_name,password=password) 推荐使用,执行效率高
第二种:
获取到当前数据对象
user_obj =models.User.objects.filter(id=user_id).first()
user_obj.name = username
user_obj.password = password
user_obj.save()
不推荐,对对象做了修改之后,所有的数据都要一起变化,效率极低
修改模型层里面的跟表相关的所有数据,只要你修改了就必须重新执行数据迁移命令
python36 manage.py makemigrations 记录到小本本
python36 manage.py migrate 操作数据库建立表字段
图书管理系统设计:
书籍表:书籍与出版社是 一对多
作者: 作者与书籍是 多对多
出版社:出版社与书籍是 多对一
外键字段名 orm会自动会在字段名后面加上_id
无论你的字段名有没有_id ,都会自动加上
django orm中表与表之间建关系
一对多 ForeignKey(to='Publish')
一对一 OneToOneField(to='AuthorDetail')
多对多 ManyToManyField(to='Author')
class User(models.Model): # user表的主键字段名就是id id = models.AutoField(primary_key=True) # varchar(32) name字段是varchar(32), CharField(max_length=32)中max_length必须要加参数 name = models.CharField(max_length=64) # varchar(32) password字段是varchar(16) password = models.CharField(max_length=16) # addr = models.CharField(max_length=32,default="China")
注意:
前面两个关键字会自动再字段后面加_id
最后一个关键字 并不会产生实际字段 只是告诉django orm自动创建第三张表