关注各种黑科技
B站UP主,编程教学,游戏玩家,挂B,金牛座

Django2 URL Namespace名称空间定义新方法

在Django2 URL Namespace名称空间定义有了新的写法, 我在升级完devecho.com后,添加新的app时遇到这个问题,需要大家注意。Django2.0新增了在urls.py中app_name来指定namespace。
我们之前通过reverse函数来反向获取url
reverse语法

reverse("<namespace>:<url-name>", kwargs={"<kwarg>": "<val>"})

在Django <= 1.11 我们通过关键词namespace参数定义名称空间

urlpatterns = [
    url(r'^posts/', include('posts.urls', namespace='posts')) 
]

在Django 2.0+ 我们可以省略namespace=

urlpatterns = [
    re_url(r'^posts/', include(('posts.urls', 'posts'))) 
]

更进一步 我们把namespace定义到被include的urls.py中去
使用app_name定义名称空间

urlpatterns = [
    re_path(r'^posts/', include('posts.urls')) 
]

posts/urls.py

from django.urls import re_path, path
from posts.views import YearArchive, ArchiveListView

app_name = 'posts'

urlpatterns = [
    ...
    re_path(r'^$', ArchiveListView.as_view(), name='archive-list'),
    re_path(r'^user/(?P<year>[0-9]{4})/$', YearArchive.as_view(), name='year-archive'),
    path('user/<int:year>/', YearArchive.as_view(), name='year-archive-path'),
]

现在我们仍然可以用reverse函数和模板中的url获取URL

reverse("posts:archive-list")
reverse("posts:archive-list", kwargs={"year": 2017})
{% url "posts:archive-list" %}
{% url "posts:year-archive" year=2017 %}
转载请注明出处
分享到: 更多 (0)

评论 0