今天学习url的带参传递法时,在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中捕获值,而且官方文档还给了一个使用的规则:
- str- 匹配除路径分隔符之外的任何非空字符串’/‘。如果转换器未包含在表达式中,则这是默认值。
- int - 匹配零或任何正整数。返回一个int。
- slug - 匹配由ASCII字母或数字组成的任何slug字符串,以及连字符和下划线字符。例如, building-your-1st-django-site。
- uuid - 匹配格式化的UUID。要防止多个URL映射到同一页面,必须包含短划线并且字母必须为小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。
- path- 匹配任何非空字符串,包括路径分隔符 ‘/‘。这使您可以匹配完整的URL路径,而不仅仅是URL路径的一部分str。
当然,如果路径和转换器语法不足以定义URL模式,则还可以使用正则表达式,这里面正则不是写入到path()
中了,而是卸载re_path()
中:
from django.urls import path, re_path from . import views urlpatterns = [ path('articles/2003/', views.special_case_2003), re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail), ]