# 旧版django
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^reviews/2003/$', views.special_case_2003),
url(r'^reviews/([0-9]{4})/$', views.year_archive),
url(r'^reviews/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^reviews/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.review_detail),
]
# 新版django
from django.conf.urls import path, re_path
from . import views
urlpatterns = [
re_path(r'^reviews/2003/$', views.special_case_2003),
re_path(r'^reviews/([0-9]{4})/$', views.year_archive),
re_path(r'^reviews/([0-9]{4})/([0-9]{2})/$', views.month_archive),
re_path(r'^reviews/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.review_detail),
- 若想捕获 URL 中的值,把值放在括号里
- 无需使用前导斜线,每个 URL 本身就有。例如,是^reviews,而非^/reviews。
- 每个正则表达式字符串前面的’r’ 是可选的,但是建议加上。它的作用是告诉 Python,那是“原始”字
符串,里面的一切内容都不应该转义
对/reviews/2005/03/ 的请求匹配上述列表中的第三个条目。Django 调用views.month_archive(request,
‘2005’, ‘03’) 函数
/reviews/2005/3/ 不匹配任何 URL 模式,因为列表中的第三个条目要求月份有两个数字
/reviews/2003/ 匹配列表中的第一个模式,而不是第二个,因为模式按顺序测试,而第一个就能让测
试通过。你可以调整顺序,添加类似这样的特例
from django.conf.urls import re_path
from . import views
urlpatterns = [
re_path(r'^reviews/2003/$', views.special_case_2003),
re_path(r'^reviews/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^reviews/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.month_archive),
re_path(r'^reviews/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$',views.review_detail),
]
- 对/reviews/2005/03/ 的请求调用views.month_archive(request,year=‘2005’,month=‘03’)函数,而不是views.month_archive(request,‘2005’,‘03’)。
- 对/reviews/2003/03/03/ 的请求调用views.review_detail(request,year=‘2003’,month=‘03’,day=‘03’) 函数。
# demo
from django.urls import path,include,re_path
from wood import views
urlpatterns = [
<!--path('home/', views.home),-->
<!--path('demo/', views.demo),-->
<!--path('page/', views.bad_page),-->
re_path(r'(?P<year>[0-9]{4})/$', views.year_today),
re_path(r'(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_today)
]
# >>> views.py
def year_today(request, year):
return HttpResponse('The moment Year is %s' % year)
def month_today(request, year, month):
return HttpResponse('The moment month is %s ,The Year is %s' % (month, year))
捕获的参数始终是字符串
不管正则表达式匹配的是什么类型,捕获的每个参数都以普通的 Python 字符串传给视图。对 URL 配置中的
这一行来说:
path(r'^reviews/(?P<year>[0-9]{4})/$', views.year_archive),
虽然[0-9]{4} 只匹配字符串中的整数,但是传给views.year_archive() 视图函数的year 参数是字符串,而不是整数。
为视图的参数指定默认值
# URL 配置
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^reviews/$', views.page),
url(r'^reviews/page(?P<num>[0-9]+)/$', views.page),
]
# 视图(在 reviews/views.py 文件中)
def page(request, num="1"):
在上述示例中,两个 URL 模式指向同一个视图,即views.page,但是第一个模式没有从 URL 中匹配任何内
容。如果匹配第一个模式,page() 函数使用num 的默认值,即"1";如果匹配第二个模式,page() 函数使用
正则表达式匹配的num 值