简体   繁体   中英

Django 2 namespace and app_name

I am having a difficult time understanding the connection between app_name and namespace.

consider the project level urls.py

from django.urls import path, include

urlpatterns = [
    path('blog/', include('blog.urls', namespace='blog')),
]

consider the app level (blog) 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'),
]

if I comment out app_name, I get the following.

'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.

If I rename app_name to some arbitrary string, I don't get an error.

app_name = 'x'

I've read the documentation but its still not clicking. Can someone tell me how/why app_name and namespace are connected and why are they allowed to have different string values? Isn't manually setting app_name redundant?

try removing app_name='blog'

In your case you should be using:

'blog:post_list'

and

'blog:post_detail'

You can also remove the namespace='blog' in your first url like so:

urlpatterns = [
path('blog/', include('blog.urls')),

]

and then in your templates you can reference the urls without the 'blog:.....':

'post_list'
'post_detail'

try using tuple.

urlpatterns = [
    path('blog/', include(('blog.urls', 'blog'))),
]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM