学习思路
path(‘网址后缀’,函数名)
一旦网址后缀匹配上了就会自动执行后面得函数
并结束整路由得匹配
路由结尾的斜杠
默认情况下不写斜杠 django会左二次处理
第一次匹配不上 会让浏览器加上浏览器斜杠再次请求
django配置文件中 可以指定是否自动添加斜杠
APPEND_SLASH = False
path转换器
当网址后缀不固定的时候 可以使用转换器来匹配
'int':Intconverter(), 匹配 整型 (常用)
'path':PathConverter(), 匹配 所有字符
'slug':SlugConverter(), 英文字符中的斜杠 下划线 或数字
'str':StringConverter(), 匹配字符串 (常用)
'uuid':UUIDConverter(), 匹配 满足uuid形式字符串
转换器匹配到的内容会当作视图函数的关键字 参数传入
path('func///' , views.func)
转换器有几个叫什么名字 那么视图函数的形参必须对应
def func(request,year,info):
pass
re_path(正则表达式,函数名)
一旦网址后缀的正则能够匹配到内容 就会自动执行后面的函数
并结束整个路由的匹配
当网址后缀不固定的时候 可以使用转换器来匹配
re_path('^test/$',views.test)
正则匹配之无名分组
正则表达式匹配到的内容会当作视图函数的位置参数传递给视图函数
re_path('^test/(\d+)/',views.test)
正则匹配之有名分组
正则表达式匹配到的内容会当作视图函数的关键字参数 传递给视图函数
re_path('^test/(?P\d+)/(?P.*?)/' ,views.test)
在django1 中只支持正则匹配 并且方法是 url()
django2,3,4中 path()re_path()等价于url()
页面上提前写死了很多路由 一旦路由发送变化会导致所有页面相关链接失效
为了防止出现问题 我们需要使用反向解析
反向解析:返回一个结果 该结果可以访问到对应的路由
路由对应关系起别名
path('register/',views.reg,name='reg_view')
使用反向解析
html页面
{% url 'reg_view' %}
后端
from django.shortcuts import reverse
reverse('reg_view')
**反向解析的操作三个方法都一样 path()
re_path()
url()
**
path('reg/' ,views.reg,name = 'reg_view')
当路由中有不确定的匹配因素 反向解析的时候需要人为给出一个具体的值
#后端
reverse('reg_view',args=('jason',))
#html
{% url 'reg_view' 'user' %}
path()
re_path()
ur;
**django中应用 都可以由自己独立的 urls.py
文件 templates
文件夹 static
文件夹 **
能够让基于django开发的多个应用完全独立 便于小组开发
总路由
path('app01/',include('app01.urls')),
path('app02/',include('app02.urls')),
子路由
path('after/',views.after) #app01
path('after/',views.after) #app02
当项目特别大 应用特别多的时候 可以使用路由分发
在路由分发场景下 多个应用在涉及到反向解析别名冲突的时候无法正常解析
解决方式一:
名称空间:
nanmespace
path('app01/',include(('app01.urls','app01'),namespace='app01'))
path('app01/',include(('app01.urls','app02'),namespace='app02'))
结局方式二:
起别名时 让别名不冲突 例如 加上应用前缀
def user_info(request):
user_list=models.User_info.objects.filter()
return render(request,'user_info.html',{'user_list':user_list})
def user_create(request):
if request.method=='POST':
username=request.POST.get('name')
password=request.POST.get('pwd')
models.User_info.objects.create(name=username,pwd=password)
return redirect(reverse('info_add'))
return render(request,'user_create.html')
def user_update(request,id):
if request.method=='GET':
user_obj=models.User_info.objects.filter(id=id).first()
return render(request,'user_update.html',{'user_obj':user_obj})
elif request.method=='POST':
name=request.POST.get('name')
pwd=request.POST.get('pwd')
models.User_info.objects.filter(id=id).update(name=name,pwd=pwd)
return redirect('info_add')
def user_dlete(request,id):
models.User_info.objects.filter(id=id).delete()
return redirect('info_add')