【问题标题】:Django reset_password_confirm TemplateSyntaxError problemDjango reset_password_confirm TemplateSyntaxError问题
【发布时间】:2011-06-15 00:28:02
【问题描述】:

当我使用不带参数的 django.contrib.auth.views.password_reset_confirm 时,它可以正常工作,并且我可以毫无问题地渲染模板,但在添加 uidb36 和令牌参数时它会失败。

渲染时捕获 NoReverseMatch:“django.contrib.auth.views.password_reset_confirm”与参数“()”和关键字参数“{'uidb36':'111','token':'1111111111111'}' 不反向找到了。

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

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

    类似:

    (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 - 是我的自定义模板

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

    【讨论】:

    • Django 内置的东西在其官方文档站点上没有此类信息似乎很荒谬。不管怎样,谢谢你的回答!近两年后仍然有用
    【解决方案2】:

    我在 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

    【讨论】:

      【解决方案3】:

      如果您使用 Django 1.6+ 并遇到类似情况,可能需要在模板和网址中将 uidb36 更新为 uidb64。

      示例网址: url(r'^password/reset/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', auth_views.password_reset_confirm

      并重置模板中的链接:

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

      【讨论】:

      • 谢谢!!这个答案为我节省了一夜的搜索时间!
      【解决方案4】:

      对于 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 %}

      【讨论】:

        【解决方案5】:

        尝试将以下内容添加到您的 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'),
        

        【讨论】:

          【解决方案6】:

          我发现这个可以工作,从默认网址复制

          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'),

          【讨论】:

            【解决方案7】:

            只需将此行添加到您的 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 附带的内置 Django PasswordResetView。

            【讨论】:

              【解决方案8】:

              如果你在每个 urls.py 中都使用 app_name

              假设您有一个应用程序,并且在该应用程序的 urls.py 中您提到了 app_name="accounts" 为了检索页面,您需要提及两件事 PasswordResetView 中的 template_name 和 success_url(template_name="accounts/password_reset.html" , success_url= reverse_lazy('accounts:password_reset_sent'))

              不要忘记从 urls.py 中的 django.urls 导入 reverse_lazy

              所以您的帐户/urls.py 的最终代码应该是这样的

              我的应用名称是登陆而不是帐户

              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:,这很重要

              【讨论】:

                猜你喜欢
                • 2012-05-26
                • 2014-01-17
                • 2020-06-16
                • 2011-05-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-01-10
                • 2010-12-25
                相关资源
                最近更新 更多