【问题标题】:Error Reverse for 'password_reset_done' not found. 'password_reset_done' is not a valid view function or pattern name.找不到“password_reset_done”的错误反转。 'password_reset_done' 不是有效的视图函数或模式名称。
【发布时间】:2022-03-07 03:15:08
【问题描述】:

我不断收到此错误 未找到“password_reset_done”的反向。 'password_reset_done' 不是有效的视图函数或模式名称。 我正在尝试使用默认视图 来自 django.contrib.auth.views

from django.conf.urls import url 
from accounts import views 
from django.contrib.auth.views import (login, 
logout, 
password_reset, 
password_reset_done, 
password_reset_confirm, 
) 


urlpatterns =[ 
url(r'^$', views.cover, name='cover'), 
url(r'^home/$', views.home, name = 'home'), 
url(r'^login/$', login, {'template_name':'accounts/login.html'}, name ="login"), 
url(r'^logout/$', logout, {'template_name':'accounts/logout.html'}, name = "logout"), # views define a link to connecct this to views then to template 
url(r'^register/$', views.register, name="register"), 
url(r'^profile/$', views.view_profile, name='view_profile'), 
url(r'^profile/edit/$', views.edit_profile, name='edit_profile'), 
url(r'^change-password/$', views.change_password, name='change_password'), 
url(r'^reset-password/$', password_reset, name= 'password_reset'), 
url(r'^reset-password/done/$', password_reset_done, name='password_reset_done'), 
url(r'^reset-password/confirm/$', password_reset_confirm, name='password_reset_confirm') 
]

请任何人帮助我...我已经检查了所有...但找不到故障。

【问题讨论】:

    标签: django-views


    【解决方案1】:

    如果你只在你的主要urls.py 中使用path('', include('django.contrib.auth.urls')) 而不是你的app_name 中的那个,它会起作用。

    【讨论】:

    • 这确实解决了我的问题
    【解决方案2】:

    请试试这个 小心注意一些错误,例如不在某些 url 的末尾添加 $ 或添加它。还要注意success_url在哪里给出,因为内部代码使用它,没有它就会丢失。

    在这段代码中,我选择用于管理用户的应用程序称为帐户,您可以调用任何名称。

    模板应该放在 django 识别的目录中,否则找不到它们这里是 settings.py 的代码

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates'),],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

    这里是完整的 urls.py

    from django.conf.urls import url
    from django.contrib.auth import views as auth_views
    from accounts.views import signup
    
    urlpatterns = [
        url(r'signup/$', signup, name='signup'),
        url(r'login/$',auth_views.LoginView.as_view(template_name='login.html')),
        url(r'logout/$',auth_views.LogoutView.as_view(template_name='logout.html')),
        url(r'password_change/$',auth_views.PasswordChangeView.as_view(template_name='password_change.html',success_url='/accounts/password_change_done')),
        url(r'password_change_done/',auth_views.PasswordChangeDoneView.as_view(template_name='password_change_done.html')),
        url(r'password_reset/$',auth_views.PasswordResetView.as_view(template_name='password_reset.html',email_template_name='password_reset_email.html',subject_template_name='password_reset_subject.txt',success_url='/accounts/password_reset_done/',from_email='support@yoursite.ma')),
        url(r'password_reset_done/',auth_views.PasswordResetDoneView.as_view(template_name='password_reset_done.html')),
        url(r'password_reset_confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',auth_views.PasswordResetConfirmView.as_view(template_name='password_reset_confirm.html',success_url='/accounts/password_reset_complete/')),
        url(r'password_reset_complete/',auth_views.PasswordResetCompleteView.as_view(template_name='password_reset_complete.html')),
    ]
    

    【讨论】:

    • 我们需要在password_reset中明确提到成功的url吗?我正在使用 django 2.2。在文档中,它应该自动转到成功 url
    • 登顶之路
    【解决方案3】:

    我遇到了同样的问题,但通过在 PasswordResetView 中添加 success_url 参数解决了它:

    添加基于类的视图PasswordResetViewsuccess_url参数。这将替换 password_reset_done 的默认路由

    url(r'^reset/$',PasswordResetView.as_view(
        template_name='password_reset.html',
        email_template_name='password_reset_email.html',
        subject_template_name='password_reset_subject.txt',
        ...
        success_url = reverse_lazy('accounts:password_reset_done')
        ...
        ...
    ),name='password_reset'),
    

    【讨论】:

    • 我相信这是当前 Django 版本的最佳答案。我要补充一点,Django 中有两个默认的身份验证视图,当使用您自己的命名空间时它们会中断。这里提到的PasswordResetViewPasswordResetConfirmView。在后一种情况下,您还应该提供指向您的password_reset_complete 路径的success_url 覆盖。
    【解决方案4】:

    这些发生在 Django 从 1.xx 更新到 2.xx 时(好吧,就像我自己的情况一样)。

    这是我的解决方案。我通过包含一个带有键“post_change_redirect”的字典来修复它,它的值指向password_change_done url。密码重置使用post_rest_redirect

    from django.contrib.auth import views as v
    from django.conf.urls import url
    
    urlpatterns = 
    ......
        url(r"password-change/$", v.password_change, {"post_change_redirect":"account:password_change_done"}, name="password_change")
    .........
    
    ]
    

    【讨论】:

      【解决方案5】:

      当 Django 从版本 1.xx 升级到版本 2.xx 时,也可能出现此特定错误

      解决这个问题:

      1. main url.py 中添加这一行:

        url(r'^', include('django.contrib.auth.urls'))
        
      2. 然后用“your_app/urls.py”中的类替换函数。例如。

        password_reset => PasswordResetView.as_view()
        

        例如:

        url(r'^reset-password/$', PasswordResetView.as_view(), name='password_reset'),
        url(r'^reset-password/done/$', PasswordResetDoneView.as_view(), name='password_reset_done'),
        
        url(r'^reset-password/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
        
        url(r'^reset-password/complete/$', PasswordResetCompleteView.as_view(), name='password_reset_complete'),
        

      【讨论】:

        【解决方案6】:

        我找到了这段代码,这似乎有效。

        from django.conf.urls import url
        from accounts import views
        from django.contrib.auth.views import  (login, 
                                            logout,     
                                            password_reset, 
                                            password_reset_done,
                                            password_reset_confirm, 
                                        )
        from django.contrib.auth import views as auth_views
        
        
        urlpatterns =[
            url(r'^$', views.cover, name='cover'), 
            url(r'^home/$', views.home, name = 'home'),
            url(r'^login/$', login, {'template_name':'accounts/login.html'}, name ="login"), 
            url(r'^logout/$', logout, {'template_name':'accounts/logout.html'}, name = "logout"),
            url(r'^register/$', views.register, name="register"),
            url(r'^profile/$', views.view_profile, name='view_profile'),
            url(r'^profile/edit/$', views.edit_profile, name='edit_profile'),
            url(r'^change-password/$', views.change_password, name='change_password'),
            url(r'^password_reset/$', auth_views.password_reset,{'email_template_name':'accounts/registration/password_reset_email.html',
                                                            'subject_template_name':'accounts/registration/password_reset_subject.txt',
                                                            'post_reset_redirect':'accounts:password_reset_done',
                                                            'from_email':'accounts@django.com',
                                                            },name='password_reset'),
        
            url(r'^password_reset/done/$', auth_views.password_reset_done, {'template_name': 'accounts/registration/password_reset_done.html'}, name='password_reset_done'),
        

        在上面的代码帐户中的 myapp 名称。您可以在其中放置自己的应用程序名称 这是 Django 1.11

        【讨论】:

          【解决方案7】:

          您缺少导入、app_name、一些模板和模板路由。

          为此更改您的代码:

          from django.conf.urls import url 
          from accounts import views 
          from django.contrib.auth import views as auth_views 
          
          app_name = 'accounts' # Django 2.0+, if not add namespace = 'accounts' on the urls.py where you are including this set of urls.
          
          urlpatterns =[ 
          url(r'^$', views.cover, name='cover'), 
          url(r'^home/$', views.home, name = 'home'), 
          url(r'^login/$', login, {'template_name':'accounts/login.html'}, name ="login"), 
          url(r'^logout/$', logout, {'template_name':'accounts/logout.html'}, name = "logout"),
          url(r'^register/$', views.register, name="register"), 
          url(r'^profile/$', views.view_profile, name='view_profile'), 
          url(r'^profile/edit/$', views.edit_profile, name='edit_profile'), 
          url(r'^change-password/$', views.change_password, name='change_password'), 
          url(r'^password_reset/$', auth_views.password_reset,{'email_template_name':'registration/password_reset_email.html',
                                                              'subject_template_name':'registration/password_reset_subject.txt',
                                                              'post_reset_redirect':'accounts:password_reset_done',
                                                              'from_email':'accounts@django.com', # Yours
                                                              },name='password_reset'),
          
          url(r'^password_reset/done/$', auth_views.password_reset_done, {'template_name': 'registration/password_reset_done.html'}, name='password_reset_done'), 
          ]
          

          确保在您的“帐户”文件夹中拥有:/templates/registration/*.html 以及所有模板

          【讨论】:

            【解决方案8】:

            对我来说,缺少的关键信息是反向解析需要在 url 条目上设置 name 属性!

                path(
                'password_change/done/',
                auth_views.PasswordChangeDoneView.as_view(template_name='SyllabusTrackerApp/change-password-done.html'),
                name="password_change_done"
            ),
            

            app_name 命名空间也没有设置,但为了简单起见,我的设置中没有使用它们,所以我可以忽略它。

            【讨论】:

              【解决方案9】:

              我找到的最简单的解决方案如下,这可能会有所帮助。 对于密码重置链接,首先在您的应用程序的 urls.py 文件中导入。

              from django.contrib.auth import views as auth_views
              

              然后在您的应用程序 urls.py 文件中添加以下路径

              path('password_reset', auth_views.PasswordResetView, name='password_reset'),
              

              你终于可以在你的 HTML 页面中使用它了,如下所示

              <a href="{% url 'accounts:password_reset'%}" class="float-end">
              

              【讨论】:

                【解决方案10】:

                我遇到了同样的问题,我刚刚将它添加到我的主项目 url:

                path('', include('django.contrib.auth.urls'))
                

                像魔术一样工作。

                【讨论】:

                • 这只是添加来自 Django 的身份验证应用程序的 URL,因此它使用其默认代码进行解析。如果您尝试重用来自不同应用的视图,则必须根据 David 的回答调整它们。
                猜你喜欢
                • 1970-01-01
                • 2018-10-14
                • 1970-01-01
                • 2020-05-30
                • 2018-01-25
                • 2020-12-01
                • 2019-06-27
                • 2021-05-18
                • 1970-01-01
                相关资源
                最近更新 更多