организация Djnago urls
Было так...
корневой 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, что бы все работало?
Ответы (1 шт):
При подключении новых приложений к 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'