Пространство имен Django 2 и имя_приложения - PullRequest
0 голосов
/ 21 января 2019

Мне трудно понять связь между именем приложения и пространством имен.

рассмотрим уровень проекта urls.py

from django.urls import path, include

urlpatterns = [
    path('blog/', include('blog.urls', namespace='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'),
]

если я закомментирую имя_приложения, я получу следующее.

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

Если я переименую app_name в произвольную строку, я не получу сообщение об ошибке.

app_name = 'x'

Я прочитал документацию, но она все еще не щелкает. Может кто-нибудь сказать мне, как / почему app_name и пространство имен связаны и почему им разрешено иметь различные строковые значения? Разве ручная настройка app_name не является избыточной?

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

попробуйте использовать кортеж.

urlpatterns = [
    path('blog/', include(('blog.urls', 'blog'))),
]
0 голосов
/ 21 января 2019

попробуйте удалить app_name = 'blog'

В вашем случае вы должны использовать:

'blog:post_list'

и

'blog:post_detail'

Вы также можете удалить namespace='blog' в своем первом URL, например, так:

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

]

и затем в ваших шаблонах вы можете ссылаться на URL без 'blog: .....':

'post_list'
'post_detail'
...