【问题标题】:NoReverseMatch at /user/password_reset/ Reverse for 'password_reset_done' not foundNoReverseMatch at /user/password_reset/ 未找到“password_reset_done”的反向
【发布时间】:2017-07-16 12:26:25
【问题描述】:

我正在尝试使用 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')),
     ...
]

用户/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.

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

【问题讨论】:

  • 您看到了这个问题并尝试了这些人的回答? stackoverflow.com/questions/27522689/…
  • @hansTheFranz 是的,我试过了。但我在 settings.py 中有EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'。而且,使用该解决方案时,在重置页面上提交电子邮件后,控制台中不会显示任何内容。但是,重定向有效。

标签: python django django-authentication


【解决方案1】:

我也遇到过这个问题。这些帖子已经过时了,所以我想给出一个修改后的答案。本质上,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/urls.py 时查看root urls.py。覆盖success_url 将解决这个问题。

【讨论】:

    【解决方案2】:
    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 Docs

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我得到了ImportError: No module named 'django.conf.urls.defaults' 这样做。
      • 在 settings.py 的已安装应用中注册 'django.conf.urls.defaults'
      • 那个家伙link 给出了另一个解决方案。但是,正如我所说,我在 settings.py 中有 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'。而且,使用该解决方案时,在重置页面上提交电子邮件后,控制台中不会显示任何内容。但是,重定向有效。
      猜你喜欢
      • 2018-06-28
      • 1970-01-01
      • 2020-12-19
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2018-01-30
      相关资源
      最近更新 更多