django相关操作
目录
由写一个登录页面的前后端来引出知识点
路由相关
路由介绍
可以将其视为网址 http://127.0.0.1:8000/login
路由访问时不加斜杠,内部会重定向加斜杠的路由
http://127.0.0.1:8000/login
如此发送给到服务器的get数据中的路由字段为 login,但是django中urls的路由与试图映射的数据是 login/ 是带有 / 斜杠的,这时首先会拿login到服务端比对,若没有则加上 / 斜杠再进行比对(http://127.0.0.1:8000/login/),有则进入页面,无则报错
静态文件相关
所有的html文件默认都写在templates文件夹下
所有静态文件(CSS,JS, 前端第三方类库)默认都放在static文件夹下,这个文件夹需要自己手动创建,创建在跟app/项目同层的文件夹
html引入外部资源的方式
cdn
本地
静态文件配置
# 在settings文件中找到STATIC_URL:
# 接口前缀,跟静态文件夹一点关系都没有,默认情况下这个前缀跟静态文件夹名字一样!!!
STATIC_URL = "/static/" # 这个static是用来识别路由的后缀的
STATICFILES_DIR = [
os.path.join(BASE_DIR, "static") # 这个static是用来拼接文件夹路径的,上面的识别成功,然后走下面的路径去找数据
os.path.join(BASE_DIR, "static1")
os.path.join(BASE_DIR, "static2")
]
# ps:会依次查找列表中所有的静态文件路径,找到的话立刻停止,都没有找到返回404
form表单相关
form表单数据提交数据的两种方式
<input type="submit">
<button></button>
form提交数据的地址如何指定
由form标签中的action属性控制提交地址
方式:
1、全路径
<form action="http://127.0.0.1:8000/login/">
</form>
2、只写路径后缀
<form action="/login/">
</form>
3、不写(默认往当前路径提交)
form表单数据的提交方式的更改
提交方式有两种:get | post
form表单默认的是get请求
但是get请求会造成用户隐私(重要信息)显现在路由上,而post提交方式则不会
更改form表单提交方式的方法:
由form表单中的method属性控制提交方式:
<form action="" mothod="post">
</form>
根据客户端请求方式的不同-执行不同的逻辑代码
def login(request): # 用户端提交的数据全部都在request中,包括请求方式,还有用户个人数据,以及路由地址等等
# 获取用户端提交的请求方式
print(request.mothod):
if request.method == "POST": # 拿到的请求方式是全大写的字符串
return HttpResponse("OK")
return render(request, "login.html") # 在此之上应为post请求的逻辑代码
如何获取客户端提交的form表单数据
def login(request):
if request.mothod == "POST":
print(request.POST) # 将其当成一个大字典即可,里面存放了客户端post提交的所有数据
# request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} >
print(request.POST.get("username")) # jason # 虽然上面的username的value是一个列表,但是却拿到了一个字符串,原因是此处的 .get()方法默认只会取value列表最后一个元素
'''
若request.POST数据中的value列表有多个值:
request.POST:<QueryDict: {'username': ['jason', 'egon'], 'password': ['123']}>
当form表单中有多选的数据是就需要把值全部取出来,那么就要用到:.getlist()
'''
print(request.POST.getlist("username")) # ['jason', 'egon'] # 想要一次性获取value列表里面的所有数据需要用到 getlist()
print(request.POST["username"]) # 不推荐使用此方法获取数据
return HttpResponse("OK")
return render(request, "login.html")
'''
总结:
获取value列表中的所有元素需要使用getlist 应用场景:用户的爱好 多选框
get 只会获取到value列表中的最后一个元素
'''
django连接数据库相关
使用django连接数据库必须完成两个步骤
# 第1步:需要修改配置文件
# 找到settings文件中的 DATABASES
# 将其修改为:
DATABASES = {
"default":{
"ENGINE":"django.db.backends.mysql",
"NAME":"day54", # 此为要连接的库名
"HOST":"127.0.0.1",
"POST":3306,
"USER":"root",
"PASSWORD":"123"
}
}
ps:键都必须为大写
# 第2步:告诉django用pymysql替换他默认的mysqldb模块来连接数据库
# 可以写在:
1、项目文件夹下面的__init__.py
2、也可以在app应用文件夹下面的__init__.py
# 固定写法
import pymysql
pymysql.install_as_MySQLdb() # 告诉django用pymysql代替mysqldb连接数据库
ORM相关
什么是ROM
对象关系映射
类 >>> 表
对象 >>> 表记录
对象的属性 >>> 一条记录某个字段对应的值
django的orm不能够自动创建库,但是可以自动创建表
ps:一个django项目就使用一个库,不要多个django项目使用一个库
数据库迁移(同步)命令 (****************)
# 此命令分为分布,有1必有2,必须配合执行: 在终端中运行
python3 manage.py makemigrations # 将你的数据库变动记录到一个小本本上(并不会帮你创建表)
python3 manage.py migrate # 将你的数据库变动同步到数据库中
ROM中对于数据库数据的增删改查
新增数据
# 操作数据库user表插入数据
# 方式一:
# user_obj = models.User.objects.create(字段1=字段1的值, 字段2=字段2的值...) # 伪代码
user_obj = models.User.objects.create(name=username,password=password)
# 方式二:
# user_obj = models.User(字段1=字段1的值, 字段2=字段2的值...) # 伪代码
user_obj = models.User(name=username, password=password)
user_obj.save() # 对象调用sava方法保存到数据库
查询数据
user_list = models.User.objects.all() # 获取user表所有的数据
# 只要是QuerySet对象,就介意点query查看到当前QuerySet对象的内部sql语句
print(user_list.query) # select id,name,password form user;
查询数据需要注意的是 你想要获取QuerySet对象还是一个数据对象
user_query = models.User.objects.filter(id=edit_id).first() # 如果你是要获取数据对象那么 .first()别忘了
.filter()当条件不存在的情况下会返回一个空的QuerySet对象
<QuerySet []> <class 'django.db.models.query_QuerySet'>
user_obj = models.User.objects.get(id=edit_id) # 用get可以直接获取到数据对象本身,但是查询条件不存在的情况下会直接摆错
QuerySet对象支持索引取值,但是不推荐使用,推荐使用自带的 .first() 来获取第一条数据
修改数据
# 编辑对象的id的获取方式
# 方式一:利用input隐藏一个标签
<input type="hidden" name="edit_id" value="a{{ user_obj.pk }}">
# 方式二:将数据放到form表单发送数据的路由地址的后缀中去
<form action="/edit/?edit_id={{ user_obj.pk }}" method="post">
# 注意:QuerySet对象点修改|删除会作用与对象内部所有的数据对象 类似于批量操作
方式一:
models.User.objects.filter(id=edit_id).update(name=username,password=password)
方式而:
user_obj = models.User.objects.filter(id=edit_id).first()
user_obj.name = username
user_obj.save()
删除数据
models.User.objects.filter(id=1).delete() # 会将QuerySet所有的数据对象全部删除
一旦修改模型层里面跟表相关的所有数据(models.py中的与表对应的类),就必须重新执行数据库迁移命令
Python3 manage.py makemigrations # 记录到小本本
python3 manage.py migrate # 真正操作数据库
页面跳转
利用a标签href属性 可以指定页面跳转的路径 href可以写全路径 但推荐写后缀即可
<a href="/reg/" class="btn btn-success">添加数据</a>
# 注意 路径的书写一定要加斜杠
重定向 可以写别人的网址 也可以是自己的路径
return redirect("/userlist")
return redirect("/userlist/")