Django重置密码确认模板语法错误问题

17
当我使用django.contrib.auth.views.password_reset_confirm而不带任何参数时,它可以正常工作,并且我可以渲染模板,但是当添加uidb36和token参数时,它会失败。
在渲染时捕获到NoReverseMatch错误:找不到带有参数“()”和关键字参数“{'uidb36': '111','token': '1111111111111'}”的'django.contrib.auth.views.password_reset_confirm'的反向匹配。
8个回答

24

很可能是您的urls.py文件存在问题。您需要设置正确的模式来获取传递为URL参数的uidb36和token值。如果没有设置正确,它将会抛出类似上面看到的错误。

例如:

(r'^reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm', {'template_name' : 'registration/password_reset.html',  'post_reset_redirect': '/logout/' })

registration/password_reset.html - 是我的自定义模板。

logout - 是我自定义的注销操作。


似乎很荒谬,Django 内置的东西在官方文档网站上没有这种信息。无论如何,感谢这个回答!即使是近两年后仍然有帮助。 - Dan Passaro

6
我曾在Django 1.3中遇到这个问题,浪费了很多时间,因为这个错误可能掩盖了许多潜在问题。
我需要在重置电子邮件模板的顶部添加以下内容:
{% load url from future %}

此外,Django文档中的示例与样本url不匹配:
{{ protocol}}://{{ domain }}{% url 'auth_password_reset_confirm' uidb36=uid token=token %}

所以我必须将上面的auth_password_reset_confirm更改为password_reset_confirm


6
如果你使用的是 Django 1.6+,遇到类似这样的问题,可能需要在模板和 URL 中将 uidb36 更新为 uidb64。
例如 URL:
```python url(r'^password/reset/confirm/(?P[0-9A-Za-z]+)-(?P.+)/$', auth_views.password_reset_confirm ```
以及模板中的重置链接:
```html {{ protocol}}://{{ domain }}{% url 'django.contrib.auth.views.password_reset_confirm' uidb64=uid token=token %} ```

谢谢!这个答案让我省去了一晚上的搜索! - Rias

2

对于Django 1.8+的用户,只需将此URL复制到您的主要urls.py文件中,以便它识别URL名称

  url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
        'django.contrib.auth.views.password_reset_confirm',
        name='password_reset_confirm'),

按照 @Lunulata 的建议,将以下内容添加到您的 password_reset_email.html 文件中:

{{ protocol }}://{{ domain }}{% url 'django.contrib.auth.views.password_reset_confirm' uidb64=uid token=token %}


1

尝试将以下内容添加到您的urls.py文件中

(r'^reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', 'django.contrib.auth.views.password_reset_confirm'),

0

只需将以下行添加到您的 urls.py 文件中即可:

url('^', include('django.contrib.auth.urls')),

这使得Django reset_password工作流程可用。

然后覆盖您的login.html文件以包含以下行:<div class="password-reset-link"> href="{{ password_reset_url }}">{% trans 'Forgotten your password or username?' %}</a></div>

现在,只要您的电子邮件设置已设置好,您就可以使用内置的Django PasswordResetView。


0

我发现这个有效,从默认的URL复制而来

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, name='password_reset_confirm'),


0
如果你在每个urls.py中都使用app_name 假设你有一个应用程序,在该应用程序的urls.py中,你已经定义了app_name="accounts"。为了检索页面,你需要提到两件事情,即template_name和success_url,这些信息包含在PasswordResetView(template_name="accounts/password_reset.html" , success_url= reverse_lazy('accounts:password_reset_sent'))中。
不要忘记在urls.py中导入django.urls中的reverse_lazy。
所以,你的最终代码应该是类似于accounts/urls.py的样子。

我的应用程序名称是landing而不是accounts。

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

app_name='landing'

urlpatterns = [
     path('',views.home,name="home"),
     path('terms/',views.terms,name="terms"),
     path('login/',views.loginUser,name="login"),
     path('signup/',views.signupUser,name="signup"),
     path('about/',views.about,name="about"),
     path('logout/',views.logoutUser,name="logout"),

     path('password_reset/',
          auth_views.PasswordResetView.as_view(template_name='landing/password_reset.html',success_url=reverse_lazy('landing:password_reset_done')),
               name="password_reset"),

     path('password_reset_sent/',
          auth_views.PasswordResetDoneView.as_view(template_name='landing/password_reset_sent.html'),
          name="password_reset_done"),

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

     path('password_reset_complete/',
          auth_views.PasswordResetCompleteView.as_view(template_name='landing/password_reset_done.html'),
          name="password_reset_complete"),

]

在你提到的URL名称前,必须使用app_name:这非常重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接