Django 2 命名空间和 app_name

bvm*_*ode 7 python django django-urls python-3.x

我很难理解 app_name 和命名空间之间的联系。

考虑项目级别的 urls.py

from django.urls import path, include

urlpatterns = [
    path('blog/', include('blog.urls', namespace='blog')),
]
Run Code Online (Sandbox Code Playgroud)

考虑应用级别(博客)urls.py

from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('<int:year>/<int:month>/<int:day>/<slug:post>/', views.post_detail, name='post_detail'),
]
Run Code Online (Sandbox Code Playgroud)

如果我注释掉 app_name,我会得到以下信息。

'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in
 the included module, or pass a 2-tuple containing the list of patterns and app_name instead.
Run Code Online (Sandbox Code Playgroud)

如果我将 app_name 重命名为某个任意字符串,则不会出现错误。

app_name = 'x'
Run Code Online (Sandbox Code Playgroud)

我已经阅读了文档,但它仍然没有点击。有人能告诉我 app_name 和命名空间是如何/为什么连接的,为什么允许它们具有不同的字符串值?手动设置 app_name 不是多余的吗?

Ton*_*dis 3

尝试删除 app_name='blog'

在你的情况下,你应该使用:

'blog:post_list'
Run Code Online (Sandbox Code Playgroud)

'blog:post_detail'
Run Code Online (Sandbox Code Playgroud)

您还可以删除namespace='blog'第一个网址中的 ,如下所示:

urlpatterns = [
path('blog/', include('blog.urls')),
Run Code Online (Sandbox Code Playgroud)

]

然后在模板中您可以引用不带“博客:.....”的网址:

'post_list'
'post_detail'
Run Code Online (Sandbox Code Playgroud)