新版本的url.py文件中,不在使用1.x的正则表达式,强制使用在程序启动的时候会提示:
WARNINGS:
?: (2_0.W001) Your URL pattern '^*article/' has a route that contains '(?P<', begins with a '^', or ends with a '$'. This was likely an oversight when migrating to django.urls.path().
1.x的写法
urlpatterns = [
url('admin/', admin.site.urls),
url('^*article/$', include('article.urls'))
]
2.x中如果要使用正则,则需要使用re_path方法
from django.urls import path, include, re_path
urlpatterns = [
path('admin/', admin.site.urls),
re_path('^.*article/$', include('xxx.urls'))
]
- 要捕获url中的一段查询字符串,除了使用正则匹配以外,现在可以使用<>,而不是原来的()
- 在<>中捕获的url查询字符串,可以指定类型, 比如
path('articles/<int:year>/', views.year_archive),
就可以将articles后面的数字匹配出来,用year参数名传递给后台,默认情况下捕获的结果保存的是字符串类型,不包含 / 这个特殊字符 - 匹配模式的最开头不需要添加/,因为默认情况下,每个url都带一个最前面的/
path('articles/<int:year>/<int:month>/', views.month_archive),
/articles/2005/03/ 将匹配第三条,并调用views.month_archive(request, year=2005, month=3);
path转换器
django2.x中内置了路径转换器
str:匹配任何非空字符串,但不含斜杠/,如果你没有专门指定转换器,那么这个是默认使用的;
int:匹配0和正整数,返回一个int类型
slug:可理解为注释、后缀、附属等概念,是url拖在最后的一部分解释性字符。该转换器匹配任何ASCII字符以及连接符和下划线,比如’ building-your-1st-django-site‘;
uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用破折号,所有字母必须小写,例如’075194d3-6885-417e-a8a8-6c931e272f00‘ 。返回一个UUID对象;
path:匹配任何非空字符串,重点是可以包含路径分隔符’/‘。这个转换器可以帮助你匹配整个url而不是一段一段的url字符串。
re_path
re_path('articles/(?P<year>[0-9]{4})/', views.year_archive),
re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_archive),
re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-_]+)/',
传递给视图的所有参数都是字符串类型