Представления Django auth PasswordReset не работают при размещении в других приложениях
Система входа/выхода для LoginView
и LogoutView
работает нормально. Однако система сброса пароля для PasswordResetView
, PasswordResetDoneView
, PasswordResetConfirmView
, PasswordResetCompleteView
вызывает ошибку.
accounts.urls:
from django.urls import path
from django.contrib.auth import views as auth_views
app_name = 'accounts'
urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='accounts/logout.html'), name='logout'),
path(
'password-reset/',
auth_views.PasswordResetView.as_view(template_name='accounts/password_reset.html'),
name='password_reset'
),
path(
'password-reset/done/',
auth_views.PasswordResetDoneView.as_view(template_name='accounts/password_reset_done.html'),
name='password_reset_done'
),
path(
'password-reset-confirm/<uidb64>/<token>/',
auth_views.PasswordResetConfirmView.as_view(template_name='accounts/password_reset_confirm.html'),
name='password_reset_confirm'
),
path(
'password-reset-complete/',
auth_views.PasswordResetCompleteView.as_view(template_name='accounts/password_reset_complete.html'),
name='password_reset_complete'
),
]
Ошибка:
NoReverseMatch at /accounts/password-reset/
Error during template rendering
In template C:\Users\Hp\Documents\Working\Personal\django\venv_socialmedia\lib\site-packages\django\contrib\admin\templates\registration\password_reset_email.html, error at line 6
5 {% block reset_link %}
6 {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
7 {% endblock %}
При более внимательном рассмотрении, особенно {% url 'password_reset_confirm' uidb64=uid token=token %}
(код из файла в виртуальной среде), я понял, что он не учитывает приложение моих учетных записей. Я перенес 4 path
, относящиеся к сбросу пароля, в свое main_project.urls
, тем самым решив проблему.
Несмотря на то, что сброс пароля работает, я на самом деле хотел вернуть все 4 сброса пароля path
обратно в accounts.urls. Причина этого в том, чтобы соответствовать принципу django plug-and-play apps. Я не совсем уверен, хорошая или плохая это идея для сброса пароля.
Несколько решений, которые я имею в виду, следующие:
- Отредактируйте файл/ы шаблонов в виртуальной среде
venv_socialmedia\lib\site-packages\django\contrib\admin\templates\registration
. - Создайте новые представления, которые наследуются от django.contrib.auth.views и переопределяют шаблоны, скопированные из каталога
venv_socialmedia\lib\site-packages\django\contrib\admin\templates\registration
.
Упомянутые мною решения, похоже, требуют много работы, однако кажется, что проблема может быть решена с помощью небольших изменений в коде/настройках. Есть ли другие возможные решения?