Встроенный в Django URL-адрес «выход» обратный URL-адрес возвращает относительный путь

#django #django-authentication

Вопрос:

Искал, но не могу найти эту конкретную проблему. Я создал отдельное приложение для аутентификации пользователя (имя: пользователь) и включил URL-адреса, используя URL-адреса django.contrib.auth. Вход в систему работает. Выход из системы завершается неудачно.

При использовании именованного представления {% url 'login' %} путь является абсолютным и работает нормально (т. е. /пользователь/логин).
При использовании именованного представления {% url 'logout' %} в том же шаблоне он получает относительный путь к моему отображаемому приложению. (т. е. пользователь/логин)

Каталог Django:

 - djangoProject
  - djangoProject
  - app1
  - user
 

Настройки приложения Django (djangoProject/settings.py):

 INSTALLED_APPS = [
    'crispy_forms',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user',
    'app1',
]
 

URL-адреса приложений Django (djangoProject/urls.py)

 urlpatterns = [
    path('app1/', include('app1.urls')),
    path('admin/', admin.site.urls),
    path('user/', include("django.contrib.auth.urls")),
    path('user/', include("user.urls")) // in case I add custom pages
]
 

URL-адреса пользовательских приложений (user/urls.py — ничего не добавлено, так как используется из django.contrib.auth.url):

 urlpatterns = [

]
 

Представления пользовательских приложений (user/views.py — ничего не добавлено. используя встроенный django.contrib.auth):

Теперь, в app1/templates/base.html, я использую следующее:

{% url 'login' %} — который генерирует URL-адрес — http://host/user/login/

{% url 'logout' %} — который генерирует URL-адрес — http://host/app1/user/logout

Если я вручную введу URL http://host/user/logout -адрес, я выйду из системы и правильно перенаправлюсь.

Есть какие-нибудь мысли? Большое спасибо!

Комментарии:

1. Возможно, попробуйте создать каталог шаблонов уровня проекта, установите параметр «Директория шаблонов» в settings.py в ‘DIRS’: [str(BASE_DIR.joinpath(‘шаблоны’))] и поместите свой base.html там, внутри. Или правильно назовите пространство имен шаблонов уровня приложения: app1/templates/app1/base.html вместо app1/templates/base.html

Ответ №1:

@wfh18 решил проблему. Перемещение моих шаблонов в шаблон с пространством имен и соответствующее обновление путей внутри шаблонов решили проблему.

От:

 - djangoProject
  - djangoProject
  - app1
    - templates
      - index.html
      - base.html
      - topbar.html
      - footer.html
      - sidebar.html
  - user
    - templates
      - login.html
 

Для:

 - djangoProject
  - djangoProject
  - app1
    - templates
      - app1
        - index.html
        - base.html
        - topbar.html
        - footer.html
        - sidebar.html
  - user
    - templates
      - user
        - login.html
 

И изменение любых ссылок на шаблоны с {% extends 'base.html' %} на {% extends 'app1/base.html' %} и т. Д