NoReverseMatch по адресу / account / password_reset / - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю над аутентификацией для проекта Django, над которым я работаю. По некоторым причинам я получаю сообщение об ошибке Reverse for 'password_reset_done' not found. 'password_reset_done' is not a valid view function or pattern name. Я установил аутентификацию в приложении accounts.

Вот содержимое базы urls.py файла:

from django.contrib import admin
from django.urls import path, include
from accounts import urls as accounts_urls
from core import urls as core_urls
from core import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    path('accounts/', include(accounts_urls, namespace='accounts')),
    path('core/', include(core_urls, namespace='core')),
]

Вот содержимое файла urls.py (в приложении аккаунтов):

from django.urls import path, reverse_lazy
from django.contrib.auth import views as auth_views
from . import views as accounts_views

app_name = 'accounts'

urlpatterns = [
    path('signup/', accounts_views.signup, name='signup'),
    path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('account_activation_sent/', accounts_views.account_activation_sent, name='account_activation_sent'),
    path('activate/<uidb64>/<token>/', accounts_views.activate, name='activate'),
    path('password_reset/', auth_views.PasswordResetView.as_view(
        template_name='accounts/password_reset.html',
        email_template_name='accounts/password_reset_email.html',
        subject_template_name='accounts/password_reset_subject.txt'
    ), 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/<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'),
]

Вот структура каталогов accounts/templates:

  • Шаблоны /
    • счета /
      • password_reset.html
      • password_reset_email.html
      • password_reset_done.html
      • password_reset_confirm.html
      • password_reset_complete.html

Я не вижу ничего плохого в том, что я сделал до сих пор. Любое сенсационное сообщение будет с благодарностью, спасибо!

Ответы [ 4 ]

0 голосов
/ 14 октября 2018

Caspian Я полагаю, вы нашли решение моей проблемы,

Переходя с Django 2.0 на 2.1, я сходил с ума, пытаясь исправить приложение для паролей в новой требуемой конфигурации ... Я не мог понятьпроблема ... я не улучшил ваше решение, но вот мои URL-коды, и он подтверждает введение "success_url = reverse_lazy", ваше решение прекрасно работает.

path('password_reset/', 
    PasswordResetView.as_view(
    template_name='app98/password_reset.html',
    email_template_name='app98/password_reset_email.html',
    subject_template_name='app98/password_reset_subject.txt',
    success_url=reverse_lazy('ns_app98:password_reset_done')), 
    name='password_reset'),

path('password_reset_done/', 
    PasswordResetDoneView.as_view(
    template_name='app98/password_reset_done.html'), 
    name='password_reset_done'),

path('password_reset_<uidb64>_<token>/', 
    PasswordResetConfirmView.as_view(
    template_name='app98/password_reset_confirm.html',
    success_url=reverse_lazy('app98:password_reset_complete')), 
    name='password_reset_confirm'),

path('password_reset_complete/', 
    PasswordResetCompleteView.as_view(
    template_name='app98/password_reset_complete.html'), 
    name='password_reset_complete'),

]

0 голосов
/ 12 сентября 2018

Представления авторизации Django не используют пространство имен при обращении URL . Это означает, что он не работает с вашими текущими URL, так как у вас есть app_name = 'account' и namespace='accounts'.

Самое простое решение - удалить имя приложения accounts и пространство имен (или переместить шаблоны URL-адресов паролей в другое urls.py, которое не имеет пространства имен.

Можно разделить представления паролей на подклассы и изменить их, используя пространство имен, но требуется довольно много изменений.

0 голосов
/ 14 сентября 2018

Я понял это!Поскольку я хотел иметь больший контроль над URL-адресами, я изменил шаблоны сброса пароля по умолчанию.Я также был склонен к использованию пространств имен, поэтому я изменил атрибут success_url по умолчанию в PasswordResetView и PasswordResetConfirmView, чтобы использовать пространство имен.Вот что я имею в виду:

from django.urls import path, reverse_lazy, include
from django.contrib.auth import views as auth_views
# Add other necessary imports

app_name = 'accounts'

urlpatterns = [    
    path('password_reset/', auth_views.PasswordResetView.as_view(
        template_name='accounts/password_reset.html',
        email_template_name='accounts/password_reset_email.html',
        subject_template_name='accounts/password_reset_subject.txt',
        success_url=reverse_lazy('accounts:password_reset_done')
    ), 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_<uidb64>_<token>/', auth_views.PasswordResetConfirmView.as_view(
        template_name='accounts/password_reset_confirm.html',
        success_url=reverse_lazy('accounts:password_reset_complete')
    ), name='password_reset_confirm'),
    path('password_reset_complete/', auth_views.PasswordResetCompleteView.as_view(
        template_name='accounts/password_reset_complete.html'
    ), name='password_reset_complete'),
]
0 голосов
/ 12 сентября 2018

Поскольку ваше password_reset_done находится в пространстве имен под accounts, вам необходимо изменить направление на accounts:password_reset_done.

Надеюсь, это поможет.

...