Django 2.1.2 密码重置身份验证视图:找不到“password_reset_confirm”的反向

Posted

技术标签:

【中文标题】Django 2.1.2 密码重置身份验证视图:找不到“password_reset_confirm”的反向【英文标题】:Django 2.1.2 Password reset auth view: Reverse for 'password_reset_confirm' not found 【发布时间】:2019-03-26 16:52:33 【问题描述】:

我的密码重置系统有问题。 代码如下。当我直接在浏览器地址中输入相应的 URL 时,它会显示预期的 Django 表单/页面。 但是,如果我填写电子邮件地址并按回车键/单击链接,我会得到“找不到‘password_reset_confirm’的反向。‘password_reset_confirm’不是有效的视图函数或模式名称。” password_reset_email.html 中的第 6 行出错。 但是我已经包含了uid64!和令牌! 此外,当我故意使用不正确的电子邮件地址时,我得到“找不到‘password_reset_done’的反向。‘password_reset_done’不是有效的视图函数或模式名称。”错误。

我无法从 django 文档、此站点上的其他类似问题或各种指南中看到,我一定错过了明显的简单步骤。

from django.urls import path
from django.contrib.auth import views as auth_views

from . import views

app_name = 'users'
urlpatterns = [
    path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
    path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
    path('password_reset/confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    path('password_reset/complete/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
    ]

【问题讨论】:

【参考方案1】:

问题是 Django 在反转密码重置 urls.py 时没有使用命名空间。您可以通过从您的 urls.py 中删除 app_name='users' 来停止错误。

或者,您可以将密码重置视图配置为使用命名空间:"

path('password_reset/', auth_views.PasswordResetView.as_view(success_url=reverse_lazy('users:password_reset_done')), name='password_reset'),

这将修复即时错误,但您会发现您需要进行一些其他更改才能修复类似错误。删除 app_name='users' 更直接。

【讨论】:

尝试使用 success_url 方法会导致 TypeError: PasswordResetDoneView() received an invalid keyword 'success_url'。 as_view 只接受已经是类属性的参数 删除应用程序名称确实有效,我在该文件中定义了其他 url。将它们分开已经成功。非常感谢您的帮助。 那个错误来自PasswordResetDoneView——我的回答说你必须改变PasswordResetView 你说的完全正确!我显然需要咖啡。非常感谢。【参考方案2】:

当您定义app_name 时,您也应该为反向指定它。 使用users:password_reset_done 而不是password_reset_done

查看reversing-namespaced-urls了解更多详情。

【讨论】:

以上是关于Django 2.1.2 密码重置身份验证视图:找不到“password_reset_confirm”的反向的主要内容,如果未能解决你的问题,请参考以下文章

电子邮件验证和密码重置 - django rest 框架和 angularjs

Laravel 5.1/AngularJS:在 Angular 视图中重置密码(如何验证 CSRF 令牌?)

Django Social Auth - 我无法重置通过Facebook签名的用户的密码

具有社交媒体身份验证的用户的 Firebase 重置密码问题

如何使用 django-rest-auth 和 Mailgun 从 Django 发送密码重置电子邮件

django 1.3中的内置密码重置视图问题