/user/password_reset 处的 NoReverseMatch/找不到 'password_reset_done' 的反向

NoReverseMatch at /user/password_reset/ Reverse for 'password_reset_done' not found

我正在尝试使用 Django 身份验证系统,但出现错误: enter image description here

'user' 是应用名称。

项目的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')),
     ...
]

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/时,我可以输入电子邮件,然后按'Submit'按钮后,出现错误(如图所示):

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

有什么解决办法吗? 非常感谢。

在你的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'),
     ...
)

在这里您可以更改您的模板名称。

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' ,一切都开始正常工作了。在重置页面上提交电子邮件后,控制台中没有显示任何内容,因为:

If the email address provided does not exist in the system, this view won’t send an email, but the user won’t receive any error message either. This prevents information leaking to potential attackers.

Django Docs

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

例如...

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" 应用程序中,因此无法找到它。默认的 属性 告诉它在需要查看 user/urls.py 时查看 root urls.py。覆盖 success_url 将解决此问题。