Django3的urls.py里的写法和Django1里的写法相差很大。
在Django3的官方文档中,介绍了urls里面使用path和re_path的一些写法。
官方文档的网址:https://docs.djangoproject.com/en/3.0/topics/http/urls/
以下是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),
]
在Django3中,path的语法使用尖括号<>来获取url中的值。捕获值时可以选择是否使用转换器converter,如果不使用转换器,则默认参数的值是字符串。例如上面例子的第一个path。
带转换器的写法的例子是<int:name>,这表示Django从url中获取一个参数(参数在两个/间),参数名是name,将参数值转换为int型。例如上面例子里的<int:year>,假设这个参数是2020的话,则它被转换为int型,名字为year。
Django3支持5种转换器:
- str
- int
- slug,例如building-your-1st-django-site
- uuid,例如075194d3-6885-417e-a8a8-6c931e272f00
- path
如果以上的用法还不能满足你对url的要求,也可以使用正则表达式。这时就不能再用path了,需要使用到re_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),
re_path(r'^comments/(?:page-(?P<page_number>\d+)/)?$', comments),
]
这时写法类似于Django1种的url写法。
以下是带参数时转向另一个函数的例子:
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,参数值是2。注意,这里就不用再在第一个path的books/后面加$了。