Django路由之url分组(命名)匹配

时间:2024-07-17 15:36:56

分组(命名)匹配

urls.py路由配置文件中:

urlspatterns中想捕获正则表达式匹配的结果用来出传递给views.py视图函数文件使用,需要用到分组匹配,或者使用第三个参数python字典进行传参。

无名分组:(正则)

位置参数:匹配出的结果按顺序依次传递给视图函数的形参(形参必须有序,匹配值按位置顺序进行传递)

有名分组:(?P<name>正则)

关键字参数:匹配出的结果按照命名对应传递给视图函数的形参(形参可以无序,匹配值按命名进行传递)

urls.py

from django.conf.urls import url

from . import views

urlpatterns = [

url(r'^articles/2003/$', views.special_case_2003),

#注意正则匹配出来的内容是字符串,即便是你在url里面写的是2003数字,匹配出来之后也是字符串

url(r'^articles/(\d{4})/$', views.year_archive),

#year_archive(request,n),小括号为分组,有分组,那么这个分组得到的用户输入的内容,就会作为对应函数的位置参数传进去,别忘了形参要写两个了,明白了吗?

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

#某年的,(?P<year>[0-9]{4})这是命名参数(正则命名匹配还记得吗?),那么函数year_archive(request,year),形参名称必须是year这个名字。而且注意如果你这个正则后面没有写$符号,即便是输入了月份路径,也会被它拦截下拉,因为它的正则也能匹配上

url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),#某年某月的

url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),

#某年某月某日的

]

views.py

views.py中视图函数的写法:

第一个参数必须是request,后面跟的三个参数是对应着上面分组命名正则匹配的每个参数,位置可以随意

def article_detail(request,month,day,year):

return HttpResponse(year+month+day)

正则匹配捕获参数和视图函数参数:

视图函数的参数规则与普通函数参数规则一致,在url()映射中可以接受第三个参数python字典当做关键字参数传递给视图函数