Django3中urls.py里path与re_path的几种用法

在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,如果不使用转换器,则默认是字符串。

带转换器的写法的例子是,这时Django从url中获取一个参数(参数在两个/间),参数名是name,将参数转换为int型。

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/后面加$了。