3

我正在为我正在处理的 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

4 回答 4

4

我想到了!由于我想更好地控制 URL,我更改了默认的密码重置模式。我也热衷于使用命名空间,因此我更改了success_urlPasswordResetView 和 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'),
]
于 2018-09-14T12:02:28.403 回答
3

里海我相信,你找到了解决我问题的方法,

从 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'),

]

于 2018-10-14T15:11:50.573 回答
1

因为你password_reset_done的命名空间在 下accounts,所以你需要反转accounts:password_reset_done

希望这可以帮助。

于 2018-09-12T11:09:55.167 回答
1

Django auth 视图在反转 urls 时不使用命名空间。这意味着它不适用于您当前的网址,因为您拥有app_name = 'account'and namespace='accounts'

最简单的解决方案是删除accounts应用程序名称和命名空间(或将密码 URL 模式移动到urls.py没有命名空间的不同位置。

可以使用命名空间对密码视图进行子类化和反转,但需要进行大量更改。

于 2018-09-12T11:10:02.403 回答