在Django的官方文档中,介绍了urls里面使用path和re_path的一些写法。
官方文档的网址:https://docs.djangoproject.com/en/3.0/topics/http/urls/
以下是path的第一个例子:
1 2 3 4 5 6 7 8 9 10 | 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), ] |
在Django3中,path使用尖括号<>来获取url中的值。捕获值时可以选择是否使用转换器converter,如果不使用转换器,则默认是字符串。
带转换器的写法的例子是
Django3支持5种转换器:
- str
- int
- slug,例如building-your-1st-django-site
- uuid,例如075194d3-6885-417e-a8a8-6c931e272f00
- path
如果以上的用法还不能满足你对url的要求,也可以使用正则表达式。这时就不能再用path了,需要使用到re_path。
以下是re_path的一个例子,里面最后的一行是嵌套的写法:
1 2 3 4 5 6 7 8 9 10 11 | 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), re_path(r'^comments/(?:page-(?P<page_number>\d+)/)?$', comments), ] |
这时写法类似于Django1种的url写法。
以下是带参数时转向另一个函数的例子:
1 2 | path('books/', views.books, name='books'), path('books/<int:bookid>/', views.book, name='book'), |
在这个例子里,当url是ip/xxx/books/时,Django调用views里面的books函数。当urls是ip/xxx/books/2/时,Django调用views里面的book函数,参数是bookid。注意,这里就不用再在第一个path的books/后面加$了。