目录
- URL基本语法
- 分组
- 路由分发
- 反向解析
- 命名空间
- 传递额外参数给视图函数
URL基本语法
"""Django 1.1.x版本的基本格式"""
from django.conf.urls import url
urlpatterns = [
url(reg, view, kwargs, name),
...
]
ps:参数说明
reg:必选,一个正则表达式字符串,表示URL规则与之匹配的会执行视图函数
view:必选,视图函数,一个可调用对象
kwargs:可选,要传递给视图函数的参数(字典形式)
name:可选,别名,用来反向获取URL
]
"""Django 2.2.x之后版本基本格式"""
from django.urls import path
urlpatterns = [
path(route, view, kwargs, name),
...
]
ps:参数说明
route:必选,字符串,表示URL规则与之匹配的会执行视图函数
view:必选,视图函数,一个可调用对象
kwargs:可选,要传递给视图函数的参数(字典形式)
name:可选,别名,用来反向获取URL
"""PS"""
Django 2.0的path不支持正则表达式,但是re_path支持正则表达式
from django.urls import re_path
urlpatterns = [
re_path(reg, view, kwargs, name),
...
]
分组
urlpatterns中的元素按照书写顺序从上至下逐一匹配正则表达式,一旦匹配成功则不在继续。
每个正则表达式前面的 ‘r’ 是可选的,但是一般加上
在正则表达式后面添加一对圆括号即可分组匹配,捕获其匹配的值传给视图函数(捕获的值永远都是字符串),即为分组,分组包括无名分组和有名分组。
关闭尾部自动补全 ‘/’(默认为开启的),在settings最下面添加:APPEND_SLASH=False
无名分组
无名分组按位置传参,一一对应,即视图函数除必须参数request外,其形参的数量应与urls中的分组数量一致。
语法:re_path(路由地址/(正则表达式))
实例:
urls.py
re_path(r'^index/(\d+)', views.index) # 匹配任意数字,将匹配的数字传递给视图函数
views.py
def index(request, args): # 接受匹配到的数据,变量名随便命名
return HttpResponse(args) # 返回数据给浏览器
有名分组
有名分组按关键字传参,除必选参数request外,其形参的数量应与urls中分组 数量一致,且名称必须一样。
语法:re_path(路由地址/(?P<组名>正则表达式))
实例:
urls.py
re_path(r'^index/(?P<num>[0-9]+)', views.index) # 匹配任意数字且组名为num,将匹配的数据传给视图函数
views.py
def index(request, num): # 接受匹配的数据且变量名必须为num
return HttpResponse(num) # 返回数据给浏览器
路由分发
使用路由分发可以使每个app都单独拥有自己的urls
步骤:
1、在每个app目录下创建一个urls.py文件
2、在项目目录下的urls.py文件里,统一将路径分发给各个app目录
语法:include(app.urls)
实例:
项目目录下的urls.py
urlpatterns = [
path('app01/', include('app01.urls')), # 路由分发
path('app02/', include('app02.urls')),
]
app01下的urls.py
urlpatterns = [
re_path(r'^index/([a-z]+)', views.index)
]
app02下的urls.py
urlpatterns = [
re_path(r'^index/(?P<every>\w+)', views.index)
]
反向解析
当路由层的url发生改变,可以在视图层和模板层动态反向解析出更改后的url,俗称起别名。
1、普通模式
语法:path(路由地址, 视图函数, name='路由别名')
实例:
urls.py
urlpatterns = [
path('index/', views.index, name='index'),
]
views.py
通过reverse进行反向解析(reverse("路由别名"))
def index(request):
return redirect(reverse('index')
templates中HTML文件下
通过模板语法进行反向解析({% url "路由别名" %})
<from action="{% url 'index' %}" method="post">
2、分组模式
无名分组
urls.py
re_path(r'index/(\d+)', views.index, name='index')
views.py
reverse("路由别名", args=(符合正则匹配的参数,))
def index(request, num):
return redirect(reverse("index", args=(num,))
templates
{% url "路由别名" 符合正则匹配的参数%}
<from action="{% url 'index' 1 %}" method="post">
有名分组
urls.py
re_path(r'^index/(?P<every>\w+)', views.index, name="index")
views.py
reverse("路由别名", kwargs={"分组名":符合正则匹配的参数}
def index(request, every):
return redirect(reverse("index", kwargs={"every":every}))
templates
{% url "路由别名" 分组名=符合正则匹配的参数%}
<from action="{% url 'index' every=1 %}" method="post">
命名空间
一个标识符可以在多个命名空间中定义,它在不同的命名空间中含义是互不相干的(相同别名下使用名称空间)
语法:include(("app名称.urls", "app名称"))
实例:
项目目录下的urls.py
urlpatterns = [
path('app01/', include('app01.urls', 'app01'))
path('app02/', include('app02.url', 'app02'))
]
app01下的urls.py
re_path(r'^index/(\d+)', views.index, name='index')
app02下的urls.py
path('index/', views.index, name='index')
app02下的views.py
reverse("app名称: 路由别名")
def index(request):
return(redirect("app01: index"))
templates下
{% url "app名称:路由别名"%}
<form action="{% url 'app01:index' %}" method="post">
传递额外参数给视图函数
可以额外传给视图函数一个字典,表示相传给视图函数的位置参数