path()
文档实例:
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
注意:
- 要从URL中取值,使用尖括号。
- 捕获的值可以选择性地包含转换器类型。或者,使用
<int:name>
来捕获整型参数。如果不包含转换器,则替换为外部/
的任何字符。 - 这里不需要添加反斜杠,因为每个URL都有。例如,应该是
articles
而不是/articles
。
一些请求的例子:
/articles/2005/03/
会匹配URL列表中的第三项。Django会调用函数。views.month_archive(request, year=2005, month=3)
/articles/2003/
会匹配列表中的第一个模式,而不是第二个,因为这些模式是按顺序测试的,而第一个是第一个通过的测试。随意利用命令来插入类似这样的特殊情况。在这里,Django将调用该函数views.special_case_2003(request)
/articles/2003
不会与任何这些模式匹配,因为每种模式都要求URL以斜杠结尾。/articles/2003/03/building-a-django-site/
会匹配URL列表中的最后一项。Django会调用函数。views.article_detail(request, year=2003, month=3, slug="building-a-django-site")
下面的路径转换器在默认情况下是有效的:
str
-匹配除'/'
之外的非空字符串。如果表达式内不包含转换器,则替换匹配字符串。int
-匹配0或任何正整数。返回一个int。slug
-匹配任意由ASCII字母或数字以及连字符和下划线组成的短标签building-your-1st-django-site
。uuid
-匹配一个格式化的UUID。为了防止多个URL映射到同一个页面,必须包含破折号和字符都为小写。例如,075194d3-6885-417e-a8a8-6c931e272f00
。返回一个UUID实例。path
-匹配任何非空字符串,包括路径分隔符'/'
。这样,您就可以匹配完整的URL路径,而不是像一样匹配URL路径的一部分str
。
比如要匹配一个视图中的函数路由,该函数有两个形参:
def test(request, test_id):
pass
对应配置:
urlpatterns = [
path('test/<int:test_id>/', views.test),
]
第一个request是默认的,那么路径自动匹配该函数的第二个形参,
匹配格式:<int:test_id>,并返回一个正整数或零值。
re_path()
如果遇上路径和转换器语法都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。
from django.urls import re_path
在Python正则表达式中,命名正则表达式组的语法是(?P<name>pattern),组name的名称,并且 pattern是要匹配的模式。
还是以上图圈中的部分为例,也是可以用正则表达式来写的。如下:
1 re_path(r'^(\d+)/$',views.peopleList,name='peopleList'),
这样也是可以匹配到views视图中的peopleList函数的形参的。
所以这两种使用方式在使用上根据实际情况自行使用。
注意:在二级路由(也即app的urls文件中),在urlpatterns后,应该加上app_name='app_name(你的app名称)'。