организация Djnago urls

Рейтинг: 0Ответов: 1Опубликовано: 18.03.2023

Было так...

корневой urls.py

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

условный accounts.urls.py

urlpatterns = [
    re_path(r'^signup/$',accounts_views.signup, 
        name='signup'),
    re_path(r'^login/$',auth_views.LoginView.as_view(template_name='accounts/login.html'), 
        name='login'),
    re_path(r'^logout/$',auth_views.LogoutView.as_view(),
        name='logout')
]

в данной вариации все работает, ссылка {% url 'login' %} отлично отрабатывает, но мне захотелось указать app_name=account в accounts.urls.py соответственно и переходить по ссылке вида {% url 'account:login' %}. как я не пробовал, ничего не работает. Постоянно получаю ошибку - Reverse for ‘login’ not found. ‘login’ is not a valid view function or pattern name. Подскажите как в данном случае, правильно организовать мои urls.py, что бы все работало?

Ответы

▲ 0

При подключении новых приложений к Django-проекту их urls.py через инструкцию include включаются в головной urls.py проекта. Но если в разных приложениях будут path() с одинаковыми name, то возникнет проблема: при обращении по такому «дублирующемуся» name всегда будет вызываться path() из того urls.py, который в головном urlpatterns подключён ближе к началу списка.

Избегать таких коллизий помогает параметр namespace (англ. «пространство имён»). Его передают третьим параметром при подключении urls.py приложения через include. Обычно для namespace указывают имя, совпадающее с названием приложения.

В корневом urls.py нужно указать не name а namespace.

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

и в accounts.urls.py нужно указать app_name = 'account'