Django 二
2021-04-18 本文已影响0人
吃可爱长大鸭
目录
1.Django模板冲突问题
2.Django路由分发
3.有名分组和无名分组
4.Django创建app流程
5.Django路由别名
6.Django名称空间
7.Django反向解析
8.Django 2.x新特性
9.Django自定义转换器
1.Django模板冲突问题
'''
方法1:在对应应用下建立自己的templates,再在templates下建立与应用名同名的文件夹,模板文件放在应用名同名的文件夹下
方法2:在项目根目录下的templates中建立每一个应用同名的文件夹,每个应用的模板文件放在自己应用名文件夹下
使用:render(request, 'app_name/test.html')
'''
2.Django路由分发
1.方法一、复杂版本
在每一个应用中建立自身的urls.py文件,语法同主路由
在主路由进行分发
from app01 import urls as app01_urls
from app02 import urls as app02_urls
# 路由分发 复杂版本
url(r'^app01/',include(app01_urls))
url(r'^app02/',include(app02_urls))
2. 方法二、进阶版本
在每一个应用中建立自身的urls.py文件,语法同主路由
在主路由进行分发
from django.conf.urls import include
urlpatterns = [
url('^app01/', include('app01.urls')),
url('^app02/', include('app02.urls')),
]
# 注:主路由分发一定不能使用$正则语法
3.有名分组和无名分组
# 无名分组:将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
path('^testnoname/(\d+)/$', views.testnoname)
# def testnoname(request, var) # var=10
# 有名分组:将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
path('^testname/(?P<num>\d+)/(?P<page>\d+)/$', views.testname)
# def testname(request, page, num) # page=1 num=10
# 注:不能混用
4.Django创建app流程
1. python3 manage.py startapp app_name
2. 去settings中配置INSTALLED_APPS, 添加记录:'app_name.apps.App_nameConfig'
# 注:app配置的顺序决定了(共同资源冲突下的)查找顺序
5.Django路由别名
1.有些路由会被大量访问(直接访问、间接访问)
2.这些路由可能后期还会发生变化
3.可以给路由设置别名,通过别名访问:<a href="{% url '路由别名' '传入有名无名分组所需参数' %}"></a>
6.Django名称空间
主路由:
from django.conf.urls import include
urlpatterns = [
path('^app01/', include('app01.urls', namespace='app01')),
path('^app02/', include('app02.urls', namespace='app02')),
]
app01应用下路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url('^test/', views.test, name='test')
]
app02应用下路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
url('^test/', views.test, name='test')
]
前端页面反向解析:{% url 'app01:test' %} | {% url 'app02:test' %}
视图函数reverse方法:url = reverse('app01:test') | url = reverse('app02:test')
解决方式2>>>:别名不能冲突(加上自己应用名作为前缀)
url(r'^text/',views.index,name='app01_text_name')
url(r'^text/',views.index,name='app02_text_name')
7.Django反向解析
当路由频繁变化的时候,html界面上的连接地址如何做到动态解析
# 1.给路由与视图函数对应关系添加一个别名(名字自己指定 只要不冲突即可)
url(r'^index/',views.index,name='index_name')
# 2.根据该别名动态解析出一个结果,该结果可以直接访问到对应的路由
前端
<a href="{% url 'index_name' %}">111</a>
后端
from django.shortcuts import reverse
reverse('index_name')
ps:redirect括号内也可以直接写别名
# 3.无名有名反向解析
url(r'^index/(\d+)/',views.index,name='index_name')
后端
reverse('index_name',args=(1,)) # 只要给个数字即可
前端
<a href="{% url 'index_name' 1 %}"></a> # 只要给个数字即可
url(r'^index/(?P<id>\d+)/',views.index,name='index_name')
后端
reverse('index_name',kwargs={'id':123}) # 只要给个数字即可
前端
<a href="{% url 'index_name' id=666 %}"></a> # 只要给个数字即可
总结
无名有名都可以使用一种(无名)反向解析的形式
from django.shortcuts import reverse
在视图函数中通过reverse方法反向解析出真实的路径
# 1.不带分组:url(r'可能会变的真实路由', 视图函数, name='路由别名')
url = reverse('路由别名')
# 2.无名分组:url(r'可能会变的真实路由(带无名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', args=(给无名分组赋值))
# 3.有名分组:url(r'可能会变的真实路由(带有名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', kwargs={给有名分组赋值,key就是有名分组名})
8.Django 2.x新特性
from django.urls import path, re_path
# 向下兼容,不建议使用url, 使用与url相同的re_path
from django.conf.urls import url
urlpatterns = [
path('index/', views.index),
# page/<int:msg>/ page/(?P<msg>(\d+)) # 访问/page/123/
# path('page/<int:msg>/', views.page),
# path('page/<str:msg>/', views.page),
# path('page/<path:msg>/', views.page),
# path('page/<slug:msg>/', views.page),
path('page/<uuid:msg>/', views.page),
]
# 1. 2.x版本re_path的使用方式同1.x版本url
# 2. path写的是绝对字符串,请求地址必须与路由地址完全匹配
# 3. path拥有五个转换器:
-- str:匹配除路径分隔符(/)外的字符串,默认
-- int:匹配自然数
-- slug:匹配字母、数字、横杠及下划线组成的字符串
-- uuid:匹配uuid形式的数据
-- path:匹配任何字符串,包括路径分隔符(/) (不能用?)
9.Django自定义转换器
# 原因:自定义正则匹配目标路径
语法:
1.自定义类
# 匹配11位的185电话
class CVT185phone:
# 匹配过程
regex = '185\d{8}'
def to_python(self, value):
return int(value)
# 反解过程
def to_url(self, value):
return '%11d' % value
# 在主路由中
from django.urls import register_converter
from 所在路径 import CVT185phone
register_converter(CVT185phone, 'phone185')
path('page/<phone185:msg>/', views.page, name="pages")