繁体   English   中英

NoReverseMatch at /user/password_reset/ 找不到“password_reset_done”的反向

[英]NoReverseMatch at /user/password_reset/ Reverse for 'password_reset_done' not found

我正在尝试使用 Django 身份验证系统,但出现错误:在此处输入图像描述

“用户”是一个应用程序名称。

项目的urls.py:

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
     url(r'^admin/', admin.site.urls),
     ...
     url(r'^user/', include('user.urls', namespace='user')),
     ...
]

用户/urls.py:

from django.conf.urls import url, include

from . import views


urlpatterns = [
    url(r'^register/$', views.register, name='register'),
    url(r'^settings/$', views.settings, name='settings'),
    url(r'^settings/password/$', views.password, name='password'),
    url(r'^settings/accounts/$', views.configure_accounts,
        name='configure_accounts'),
    url(r'^settings/accounts/error/$', views.configure_accounts_error,
        name='configure_accounts_error'),
    url('^', include('django.contrib.auth.urls')),
]

我可以访问/user/login/、/user/logout/。 当我转到 /user/password_reset/ 时,我可以输入电子邮件,并且在按下“提交”按钮后,出现错误(如图所示):

NoReverseMatch at /user/password_reset/
Reverse for 'password_reset_done' not found. 'password_reset_done' is not a valid view function or pattern name.

任何想法如何解决这一问题? 非常感谢。

我也遇到了这个问题。 这些帖子已经过时了,所以我想给出修改后的答案。 本质上, PasswordResetConfirmView具有可以在urls.py中设置的success_url属性。

所以例如...

path('password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(
    template_name='password-reset-confirm.html', success_url=reverse_lazy(
        'user:password_reset_complete')),
     name="password_reset_confirm"),

问题是密码重置确认的默认行为。 具体来说,它设置了success_url = reverse_lazy('password_reset_complete') 由于您的password_reset_complete视图在您的“用户”应用程序中,因此找不到它。 默认属性告诉它在需要查看user/urls.py时查看urls.py 覆盖success_url将解决这个问题。

url(r'^password_reset/$', auth_views.password_reset, {
        'post_reset_redirect': '/user/password_reset/done/'
    }, name='password_reset'),
    url(r'^password_reset/done/$', auth_views.password_reset_done,
        name='password_reset_done'),
    url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
        auth_views.password_reset_confirm, {
         'post_reset_redirect': '/user/reset/done/'
    }, name='password_reset_confirm'),
    url(r'^reset/done/$', auth_views.password_reset_complete,
        name='password_reset_complete'),

我在 user/urls.py 中设置了“post_reset_redirect”,一切都开始正常工作。 在重置页面上提交电子邮件后,控制台中没有显示任何内容,因为:

如果提供的电子邮件地址在系统中不存在,则此视图不会发送电子邮件,但用户也不会收到任何错误消息。 这可以防止信息泄露给潜在的攻击者。

Django 文档

在您的 user/urls.py 中,您似乎没有 url,名为/user/password_reset/

如果你想使用 django.auth 默认密码重置然后使用,

from django.contrib.auth.views import password_reset

urlpatterns = patterns('',
     (r'^/accounts/password/reset/$', password_reset,{'template_name': 'my_templates/password_reset.html'}, name='password_reset_done'),
     ...
)

您可以在此处更改模板名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM