今日内容详细
可视化界面之数据增删改查
针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取
在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看
'''
form表单中能够触发调剂动作的按钮只有两个
<input type='submit'/>
<button></button>
'''
1.数据展示功能
开设接口、获取数据、传递页面、展示数据
2.数据添加功能
开设接口、获取数据、发送数据、校验数据、录入数据、重定向
3.数据编辑功能
开设接口、后端如何区分所要编辑的数据(问号携带参数)、后端获取用户数据、前端展示默认数据、获取用户并完成更新
4.数据删除功能
开设接口、问号携带参数、删除二次确认
django请求生命周期流程图
![image]()
django路由层
路由匹配
1.原理
一旦网址后缀匹配上,就会自动执行后面的函数,并结束整个路由匹配
path('网址后缀',函数名)
path('index/', views.index)
2.关于路由结尾的斜杠
django2.X及以上 path第一个参数写什么就匹配什么
django1.X第一个参数是正则表达式
无论什么版本django都自带加斜杠后缀的功能 也可以取消
配置文件中添加 APPEND_SLASH = False
转换器
正常情况下很多网站都会有很多相似的网址 如果我们每一个都单独开设路由不合理
总结 当网址后缀不固定的时候即可使用转换器
django2.X及以上版本路由动态匹配有转换器(五种)
常用:
str:匹配除路径分隔符外的任何非空字符串。
int:匹配0或者任意正整数。
不常用:
slug:匹配任意一个由字母或数字组成的字符串。
uuid:匹配格式化后的UUID。
path:能够匹配完整的URL路径
ps:还支持自定义转换器(自己写正则表达式匹配更加细化的内容)
# 转换器 将对应位置匹配到的数据转换成固定的数据类型
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='转换器匹配到的类型转换之后的内容')
转换器匹配到的内容会以关键字参数的形式传给视图函数
def login(request, info, id):
正则匹配
django2.x及以上的版本中默认的路由是path,所以re_path需要自己手动导入 第一个参数是正则
匹配的本质是 只要第一个正则表达式能够从用户输入的路由中匹配到数据就算匹配成功 会立刻停止路由层其他的匹配 直接执行对应的视图函数
re_path('^test/$', views.test)
django1.X路由匹配使用的是url() 功能与django2.X及以上的re_path()一致
正则匹配的无名有名分组:
无名分组
re_path('^test/(\d{4})/', views.test)
会将括号内正则匹配到的内容当做位置参数传递给视图函数
def test(request,a)
有名分组
re_path('^test/(?P<year>\d{4})/', views.test)
会将括号内正则匹配到的内容当做关键字参数传递给视图函数
def test(request,year)
注意上的分组不能混合使用!!!
反向解析
1.引入反向解析
由于页面上提前写死了很多路由,一旦路由发生变化,会导致所有的页面相关链接失效,为了防止该问题的出现,需要反向解析
通过一个名字可以反向解析出一个结果 该结果可以访问到某个对应的路由
2.反向解析定义:
返回一个结果,该结果可以访问到对应的路由
1.路由匹配关系起别名
path('login001/', views.login, name='login_view')
2.反向解析语法
html页面上模板语法:
<a href="{% url 'login_view' %}">111</a>
后端语法:
reverse('login_view')
动态路由的反向解析
path('func1/<str:others>/', views.func1_func, name='func1_view')
html页面上模板语法
{% url 'func1_view' 'jason' %}
后端语法
reverse('func1_view', args=('嘿嘿嘿',))
路由分发
django支持每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起
多个应用都有很多路由与视图函数的对应关系 这个时候可以拆分到各自的路由层中
使用路由分发之前 总路由直接干 路由与视图函数的匹配
path('index/', index)
使用路由分发之后 总路由只按照应用名分配匹配方向
path('app01/', include('app01.urls'))
名称空间
路由分发之后 针对相同的别名能否自动反向解析出不同的应用前缀
默认情况下是无法直接识别应用前缀的
如果想要正常识别区分有两种方式
方式1:名称空间
总路由
path('app01/',include(('app01.urls','app01'), namespace='app01')),
path('app02/',include(('app02.urls','app02'), namespace='app02')),
反向解析
reverse('app01:index_view')
reverse('app02:index_view')
方式2:别名不冲突即可
多个应用别名不冲突可以用应用名当作别名的前缀
path('index/', views.index, name='app01_index_view')
path('index/', views.index, name='app02_index_view')
虚拟环境
项目1需要使用:django1.11
pythonn38
项目2需要使用:django2.22 pymysql requests
pythonn38
项目3需要使用:django3.22 request_html flask urllib3 python38
实际开发项目中我们只会给项目配备所需的环境 不需要的一律不配
虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境
pycharm创建虚拟环境:每创建一个虚拟环境就相当于中心下载了一个全新的解释器
命令行的方式:python -m venv 虚拟环境名称
注意:pyhton命令此处不支持多版本共存的操作 python27 python36 python38
激活
activate
关闭
deactivate
pip install --index-url
http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com