五分喜欢的人,恨不得把他挂在嘴上招摇过市。
有七分喜欢,就只能跟至亲密友分享。
有十分喜欢 ,那就谁也不舍得说了,憋着,每天憋着一点小高兴,
像只松鼠攒着满腮帮子的果仁(*?ω?)
---------------------不定时的更新又又叕开始了,且更且珍惜------------------------
我要每次都写一遍:前面的还没补完,以此催促不定时更新的我
-----------------------------------------------------------------------------------------------
要想更好的掌握后面的内容,你需要先学习这些内容。
?? 路由访问
路由访问如果不加斜杠 会内部自动重定向加斜杠的路由
(表面看起来像直接给你加了斜杠,但本质是先去查找不带斜杠的,
如果匹配不上,再重定向加上斜杠的路由。)
?? templates文件夹
所有的HTML文件默认都放在templates文件夹下。
?? static文件夹
所有的静态文件(css,js,前端第三方类库)默认都放在static文件夹下。
这个文件夹是需要我们自己手动创建的,可以建在与templates同级目录,
每个app都可以有自己的static文件夹(包含css和js文件夹)
?? HTML页面引入外部资源两种方式
①cdn ②本地
这时候如果我们在浏览器中访问本地服务端的时候,你会发现你所设置的
css,js样式并没有生效(虽然你一顿操作猛如虎,此刻也是黑人问号脸)
这是因为服务端用的本地的时候,客户端是访问不到的
客户端在访问的时候静态文件夹路由会变成127.0.0.1/8080/mydjango/static
而你的静态文件夹路径可能是D:\mydjango\static,那么结果可想而知。
为了让客户端能访问到静态文件(比如本地导入的Bootstrap等),
我们需要修改Django的settings.py:
1.找到 settings.py,最下面
2. 在其下面添加STATICFILES_DIRS = [],里面存放静态文件夹的路径。
STATICFILES_DIRS = [ os.path.join(BASE_DIR,‘static‘) ]
注意:
# /xxx/ 这是接口前缀,跟你的静态文件夹的名字一点关系都没有 它规定了你HTML界面导入静态文件的路径前缀 /名字/ 这个名字可以随意取,,默认情况下这个前缀跟静态文件夹名字一样!!! STATICFILES_DIRS = [ os.path.join(BASE_DIR,‘static‘) ] # 暴露给外界能够访问服务器静态文件夹下面所有的资源 STATIC_URL = ‘/xxx/‘ # 接口前缀 跟你的静态文件夹的名字一点关系都没有 # 默认情况下这个前缀跟静态文件夹名字一样!!! # 静态文件配置(静态文件夹路径,可以有多个,因为每个app也可以有自己的static文件夹) STATICFILES_DIRS = [ os.path.join(BASE_DIR,‘static‘), # 就是你的静态文件夹路径 os.path.join(BASE_DIR,‘static1‘), os.path.join(BASE_DIR,‘static2‘) ] # ps:浏览器访问时会依次查找列表中所有的静态文件路径 找到的话立刻停止,都没有找到返回404
3. 修改HTML文件中导入静态文件的路径,路径开头都换成接口前缀,
后面跟static文件下你要导入的文件的相对路径即可。
?? form表达提交数据的两种方式
方式一:submit
<input type="submit">
方式二:button按钮
<button>button</button>
?? form提交数据的地址如何指定及方式?
指定:action属性控制提交的地址
方式:
1:全路径
<form action="http://127.0.0.1:8000/login/">
2:只写路径后缀(浏览器会自动拿当前页面的host、ip帮你补全路径)
<form action="/login/">
3:不写(默认往当前路径提交)
注意:form表单默认是GET请求,当用户向后端提交form表单数据时,
我们需要通过method属性将其改为POST。
<form action="/login/" method=‘POST‘>
单单这样还不够,为了POST请求不报错,我们需要先将Django的
settings.py中注释掉一个中间件。
当后端接收到前端传来的请求时,要先判断具体的请求方式,
判断浏览器是单纯想获取页面信息还是有数据提交给后端
根据客户端请求方式的不同执行不同的逻辑代码
如何判断请求方式
request.method
以登录为例使用request.method判断请求方式:
def login(request): # 获取用户端提交的请求方式 print(request.method) # 拿到的请求方式是全大写的字符串 if request.method == ‘GET‘: return render(request,‘login.html‘) elif request.method == ‘POST‘: return HttpResponse("收到了 老弟") 个人建议按照下面这种方式书写 减少代码冗余及结构混乱的问题 def login(request): if request.method == ‘POST‘: return HttpResponse(‘OK‘) return render(request,‘login.html‘)
def login(request):
# 获取用户端提交的请求方式
print(request.method) # 拿到的请求方式是全大写的字符串
# if request.method == ‘GET‘:
# return render(request,‘login.html‘)
# elif request.method == ‘POST‘:
# return HttpResponse("收到了 老弟")
if request.method == ‘POST‘:
print(request.POST) # 你就把它当成一个大字典里面存放了客户端post提交的所有的数据
# request.POST:< QueryDict: {‘username‘: [‘jason‘], ‘password‘: [‘123‘]} >
print(request.POST.get(‘username‘)) # value虽然是个列表但是获取value的时候拿到却是单个元素
# 默认只会取value列表里面的最后一个元素
# request.POST:<QueryDict: {‘username‘: [‘jason‘, ‘egon‘], ‘password‘: [‘123‘]}>
print(request.POST.getlist(‘username‘)) # 要想一次性获取value列表里面所有的数据需要用getlist()
# [‘jason‘, ‘egon‘]
print(request.POST[‘password‘]) # 不推荐使用该方法获取数据
return HttpResponse(‘OK‘)
return render(request,‘login.html‘)
获取value列表里面所有的元素需要使用getlist 应用场景:用户的爱好 多选框
get只会获取到value列表的最后一个元素
print(request.GET) # <QueryDict: {‘username‘: [‘jason‘], ‘password‘: [‘123‘]}>
request.GET.get(‘user‘)
# <QueryDict: {‘username‘: [‘jason‘,‘egon‘], ‘password‘: [‘123‘]}>
request.GET.getlist(‘username‘)
django连接数据库
1.需要修改配置文件
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘,
‘NAME‘: ‘day54‘,
‘HOST‘:‘127.0.0.1‘,
‘PORT‘:3306,
‘USER‘:‘root‘,
‘PASSWORD‘:‘123‘
}
}
ps:键必须都是大写
2.告诉django用pymysql替换它默认mysqldb模块连接数据库
方式1:在你的项目文件夹下面的__init__.py
方式2:也可以在你的应用文件夹下面的__init__.py
# 固定写法
import pymysql
pymysql.install_as_MySQLdb() # 告诉django用pymysql代替mysqldb连接数据库
什么是ORM?
对象关系映射
类》》》 表
对象 》》》 表记录
对象的属性 》》》 一条记录某个字段对应的值
django的orm不能够自动帮你创建库,但是可以自动帮你创建表
提示:一个django项目就使用一个库,不要多个django项目使用一个库
数据库迁移(同步)命令(******)
python3 manage.py makemigrations 将你的数据库变动记录到一个小本本上(并不会帮你创建表)
python3 manage.py migrate 将你的数据库变动正在同步到数据库中
新增数据
# 操作数据库user表插入数据
# 方式1:
user_obj = models.User.objects.create(name=username,password=password)
# 方式2:
user_obj = models.User(name=username,password=password)
user_obj.save() # 对象调用save方法保存到数据库
查询数据
user_list = models.User.objects.all() # 获取user表所有的数据
# 只要是QuerySet就可以点query查看获取到当前QuerySet对象的内部sql语句
print(user_list.query)
利用a标签href属性 可以指定页面跳转的路径 href可以写全路径 但是推荐写后缀即可
<a href="/reg/" class="btn btn-success">添加数据</a>
# 注意 路径的书写一定要加斜杠
重定向 可以写别人的网址也可以是自己的路径
return redirect(‘/userlist‘)
return redirect(‘/userlist/‘)
queryset对象支持索引取值 但是不推荐你使用 推荐使用自带的.first()帮你获取第一条数据
删除
models.User.objects.filter(id=1).delete() # 会将queryset所有的数据对象全部删除
查询数据需要注意的是你获取到的到底是一个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可以直接获取到数据对象本身但是查询条件不存在的情况下直接报错
编辑
编辑对象的id的获取方式
方式1:利用input隐藏一个标签
<input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
方式2:
<form action="/edit/?edit_id={{ user_obj.pk }}" method="post">
注意:queryset对象点修改 删除 会作用于对象内部所有的数据对象 类似于批量操作
方式1:
models.User.objects.filter(id=edit_id).update(name=username,password=password)
方式2:获取到当前数据对象
user_obj = models.User.objects.filter(id=edit_id).first()
user_obj.name = username
user_obj.save()
修改模型层里面的跟表相关的所有的数据,只要你修改了就必须重新执行数据库迁移命令
python manage.py makemigrations 记录到小本本上
python manage.py migrate真正操作数据库
django请求生命周期
图书管理系统表设计
书籍表
作者
出版社
外键字段名 orm会自动在字段名后面加_id.无论你的字段名有没有_id
端午作业
先整理今天的笔记与博客
用户的增删该查
尽最大努力完成图书管理系统
起码给我展示图书 作者 出版社信息
ps:视图函数必须返回一个HttpResponse对象
(*?ω?)
---恢复内容结束---
---恢复内容结束---
原文:https://www.cnblogs.com/yangyinyin/p/10989174.html