Проблема с аутентификацией в Django: Вместо шаблонов отображается страница администратора

В настоящее время я изучаю аутентификацию Django и столкнулся с проблемой настройки HTML-шаблонов. Вместо того, чтобы отображать мои пользовательские шаблоны, Django перенаправляет меня на панель администратора.

Например, когда я изменяю LOGOUT_REDIRECT_URL на logout и name в TemplateView на logout, я ожидаю увидеть мою пользовательскую страницу выхода из системы, расположенную по адресу templates/registration/logout.html. Однако Django продолжает перенаправлять меня на стандартную страницу выхода из панели администратора. Но когда я устанавливаю оба значения в customlogout, он направляет меня правильно.

Аналогичным образом у меня возникла проблема с кнопкой "Забыли пароль?". При нажатии на нее я ожидаю, что меня направят на templates/registration/password_reset_form.html, но вместо этого я перенаправляюсь на панель администратора Django.

Ниже приведена моя установка кода:

settings.py:

LOGIN_REDIRECT_URL = 'home'
LOGOUT_REDIRECT_URL = "customlogout"

app urls.py:

from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path('', TemplateView.as_view(template_name='home.html'), name='home'), 
    path('logout/', TemplateView.as_view(template_name='logout.html'), name='customlogout'), 
]

project urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('account.urls')),
    path("accounts/", include("django.contrib.auth.urls")), 
]

Шаблон сброса пароля templates/registration/password_reset_form.html:

<h1>Password Reset</h1>
<p>Enter your email ID to reset the password</p>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Reset</button>
</form>

Редактирование
. Если я перемещу свои шаблоны из папки registration в папку templates, то будет работать следующее

 path('logout/', auth_views.LogoutView.as_view(template_name='logout.html'), name='logout'),
    path('password-reset/', auth_views.PasswordResetView.as_view(template_name='password_reset_form.html'), name='password_reset'),

Но почему он не работает раньше

Ваши шаблоны находятся в этих местах:

templates/registration/logout.html
templates/registration/password_reset_form.html

В то время как в urls.py

вы передаете неправильное местоположение.

Вы должны передать правильное местоположение:

path('logout/', TemplateView.as_view(template_name='registration/logout.html'), name='customlogout'), 
path('password-reset/', auth_views.PasswordResetView.as_view(template_name='registration/password_reset_form.html'), name='password_reset'),

Точка 1

когда я изменяю LOGOUT_REDIRECT_URL на logout и имя в TemplateView на logout, я ожидаю увидеть мою пользовательскую страницу выхода из системы, расположенную по адресу templates/registration/logout.html.

В django по умолчанию параметр template_name задается относительно папки templates. Поскольку ваш файл logout.html находится в директории templates/registration/logout.html, template_name должен иметь вид:

path('logout/', TemplateView.as_view(template_name='registration/logout.html'), name='customlogout'),

В противном случае django будет использовать свой стандартный шаблон logout.html (что и происходит в вашем случае).

Если я перемещаю свои шаблоны из папки registration в папку templates, то работает следующее

Это потому, что вы переопределяете стандартный файл django logout.html.

Точка 2

Что касается имен url-маршрутов, то здесь тоже происходит нечто подобное. Ваше пользовательское name=logout имя url перекрывается с именем url по умолчанию в django.

Чтобы предотвратить это, вам следует определить app_name в файле urls.py

например

app urls.py:

from django.urls import path
from django.views.generic import TemplateView

app_name = 'main_app' # or 'registration_app' or just 'app'

urlpatterns = [
    path('', TemplateView.as_view(template_name='home.html'), name='home'), 
    path('logout/', TemplateView.as_view(template_name='logout.html'), name='logout'), 
]

и в файлах шаблона вы должны включить app_name в теги url:

some_html_page.html:

 <a class="logout-link" href="{% url 'main_app:logout' %}">
  logout
 </a>

После нескольких часов работы я нашел проблему в своем коде. Сначала мне нужно переименовать logout.html в logged_out.html. Ссылка здесь
Во-вторых, мне нужно изменить порядок INSTALLED_APPS в settings.py и поместить мое приложение на первую позицию. ref here.

Теперь мой обновленный код выглядит следующим образом
urls.py из приложения

urlpatterns = [
    path('', TemplateView.as_view(template_name='home.html'), name='home'), 
]

urls.py проекта

urlpatterns = [
    path('admin/', admin.site.urls),
    path("accounts/", include("account.urls")),
    path("accounts/", include("django.contrib.auth.urls")),
]

settings.py

INSTALLED_APPS = [
    'account.apps.AccountConfig',# put app here
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

LOGIN_REDIRECT_URL = 'home'
LOGOUT_REDIRECT_URL = "logout"

Все названия шаблонов по умолчанию можно найти здесь. Опечатка в названии html-файла шаблона не будет работать.

Вернуться на верх