可视化界面之数据增删改查
针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取
在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看
'''
form表单中能够触发调剂动作的按钮只有两个
<input type='submit'/>
<button></button>
'''
1.数据展示功能
开设接口、获取数据、传递页面、展示数据
2.数据添加功能
开设接口、获取数据、发送数据、校验数据、录入数据、重定向
3.数据编辑功能
开设接口、后端如何区分所要编辑的数据(问号携带参数)、后端获取用户数据、前端展示默认数据、获取用户并完成更新
4.数据删除功能
开设接口、问号携带参数、删除二次确认
django请求生命周期流程图
1.浏览器发送一个基于HTTP协议的请求
2.进入web服务网关接口将请求来的数据拆解成一个request大字典
3.进入django框架里的中间件,相当于保安负责django安全性
4.进入django后端路由层完成功能匹配
5.进入视图层执行核心业务逻辑
6.执行核心业务逻辑的时候可能需要用到html页面,这时候就需要用到模板层
7.用模板的时候也可能用到数据库的数据,这时候用到模型层,由模型层帮你去跟数据库交涉
8.由orm把数据库返回的数据封装成一个数据对象,返回到视图层做一个模板语法,模板渲染
9.由视图层直接返回到中间件再做一层校验,怕携带危险数据
10.没问题会交给web服务网关接口封装数据发给浏览器
- 学习流程
路由层、视图层、模板层、模型层、组件、BBS项目
django路由层
- 1.路由匹配(路由结尾的斜杠)
path('网址后缀',函数名)
只要网址后缀匹配上了就会自动执行后面的函数并结束整个路由的匹配。
django2.X及以上 path第一个参数写什么就匹配什么
django1.X第一个参数是正则表达式
默认的情况下不写斜杠django会做二次处理,第一次匹配不上就会让浏览器自动加上斜杠再次请求。
django配置文件中可以指定是否自动添加斜杠:
APPEND_SLASH = False # 取消斜杠二次处理机制
- 2.path转换器
正常情况下很多网站都会有很多相似的网址 如果我们每一个都单独开设路由不合理
django2.X及以上版本路由动态匹配有转换器(五种)
str:匹配除路径分隔符外的任何非空字符串。
int:匹配0或者任意正整数。
slug:匹配任意一个由字母或数字组成的字符串。
uuid:匹配格式化后的UUID。
path:能够匹配完整的URL路径
ps:还支持自定义转换器(自己写正则表达式匹配更加细化的内容)
- 基本使用:
urls.py
path('func/<int:year>/<str:info>/', views.func)
views.py
def func(request,year,info):
pass
# 转换器 将对应位置匹配到的数据转换成固定的数据类型
path('index/<str:info>/', views.index_func), # index_func(实参request对象,info='转换器匹配到的类型转换之后的内容')
path('index/<str:info>/<int:id>/', views.index_func) # index_func(实参request对象,info='转换器匹配到的类型转换之后的内容',id='转换器匹配到的类型转换之后的内容')
转换器匹配到的内容会当做视图函数的关键字参数传入,转换器有几个叫什么名字,那么视图函数的形参必须对应。
-
3.re_path正则匹配
re_path(正则表达式,函数名)
django2.X及以上版本有re_path 第一个参数是正则
匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到数据就算匹配成功会立刻停止路由层其他的匹配直接执行对应的视图函数
re_patn('^test/$', views.test) #^是限制开头$是限制结尾
django1.X路由匹配使用的是url() 功能与django2.X及以上的re_path()一致
-
4.正则匹配之无名分组
re_path('^test/(?P<year>\d{4})/', views.test)
路由匹配成功之后就会调用视图函数默认情况下会自动给视图函数传递一个request位置参数
def test(request):
return HttpResponse('测试')
如果路由匹配中使用括号对正则表达式进行了分组,那么在调用视图函数的时候,会将括号内匹配到的内容当做位置参数传递给视图函数。
# test(request,括号内正则表达式匹配到的内容)
例子:正则匹配到的内容是123
def test(request,123):
return HttpResponse('测试')
-
5.正则匹配之有名分组
re_path('^test/(?P<year>\d+)/(?P<others>.*?)/',views.test)
给括号内的正则表达式起别名之后,匹配成功则会讲括号内匹配到的内容按照关键字参数传递给视图函数。
# testadd(request,user_id=括号内正则表达式匹配到的内容)
例子:正则匹配到的内容是123
def test(request,user_id=123):
return HttpResponse('测试')
- 两者是否可以混合使用?
url(r'^test/(\d+)/(?P<year>\d+)/$', views.testadd) # 不可以 无名有名分组不能混合使用!!! 单个可以重复使用
url(r'^test/(\d+)/(\d+)/$', views.testadd) # 可以
url(r'^test/(?P<a>\d+)/(?P<b>\d+)',views.testadd) # 可以
反向解析
a标签的href可以写网址的全称,也可以写后缀。
href='https://www.baidu.com'
href='/login/' # 自动补全当前服务的ip和port href='127.0.0.1:8000/login/'
页面上有很多a标签链接了其他路由,一旦路由发送变化会导致所有页面相关链接失效。
为了防止出现该问题,我们需要使用反向解析
反向解析:返回一个结果,该结果可以访问到对应的路由。
步骤一:路由对应关系起别名
path('register/', views.reg, name='reg_view')
步骤二:使用反向解析语法
html页面:
html页面上模板语法 {% url 'reg_view' %} # reg666/ 结果可以访问路由
例子:<a href="{% url 'reg_view' %}">reg_view</a>
后端:
from django.shortcuts import reverse
reverse('reg_view') # reg666/ 结果可以访问路由
-
无名有名反向解析
步骤一:路由对应关系起别名
path('reg/<str:info>/', views.reg, name='reg_view')
步骤二:使用反向解析语法
当路由中有不确定的匹配因素,反向解析的时候需要人为给出一个具体的值
html页面:
html页面上模板语法 {% url 'reg_view' 'jason' %}
后端:
from django.shortcuts import reverse reverse('reg_view', args=('jason',))