Проблема с аутентификацией в 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-файла шаблона не будет работать.