【问题标题】:Django 2.0 - Reverse for 'password_change_done' not found. 'password_change_done' is not a valid view function or pattern nameDjango 2.0 - 未找到“password_change_done”的反向。 “password_change_done”不是有效的视图函数或模式名称
【发布时间】:2018-04-05 23:26:07
【问题描述】:

我在尝试更改我的应用程序密码后收到此错误消息。

您知道导致这条路线失败的原因吗?

其实是修改密码,但没有渲染成功模板“password_change_done.html”。

谢谢!

app/urls.py

from django.contrib.auth import views as auth_views
from django.urls import path
​
from . import views
​
app_name = 'account'
​
urlpatterns = [
    # path('login/', views.user_login, name='login'),
    path('', views.dashboard, name='dashboard'),
​
    # login / logout urls
    path('login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('logout-then-login/', auth_views.logout_then_login, name='logout_then_login'),
​
    # change password urls
    path('password-change/', auth_views.PasswordChangeView.as_view(), name='password_change'),
    path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(), name='password_change_done'),
]
​

​

错误信息

# NoReverseMatch at /account/password-change/
# Reverse for 'password_change_done' not found. 'password_change_done' is not a valid view function or pattern name.
# Request Method:   POST
# Request URL:  http://localhost:8000/account/password-change/
# Django Version:   2.0.4
# Exception Type:   NoReverseMatch
# Exception Value:  
# Reverse for 'password_change_done' not found. 'password_change_done' is not a valid view function or pattern name.
# Exception Location:   C:\env\django_social_website\lib\site-packages\django\urls\resolvers.py in _reverse_with_prefix, line 632
# Python Executable:    C:\env\django_social_website\Scripts\python.exe
# Python Version:   3.6.3
# Python Path:  
# ['C:\\Projects\\django_social_website',
#  'C:\\env\\django_social_website\\Scripts\\python36.zip',
#  'C:\\ProgramData\\Anaconda3\\DLLs',
#  'C:\\ProgramData\\Anaconda3\\lib',
#  'C:\\ProgramData\\Anaconda3',
#  'C:\\env\\django_social_website',
#  'C:\\env\\django_social_website\\lib\\site-packages',
#  'C:\\env\\django_social_website\\lib\\site-packages\\setuptools-28.8.0-py3.6.egg',
#  'C:\\env\\django_social_website\\lib\\site-packages\\pip-9.0.1-py3.6.egg']
# Server time:  Thu, 5 Apr 2018 21:34:22 +0000

​

app/templates/registration/password_change_form.html

{% extends "base.html" %}
​
{% block title %}Change your password{% endblock %}
​
{% block content %}
    <h1>Change your password</h1>
    <p>Use the form below to change your password.</p>
    <form action="." method="post">
        {{ form.as_p }}
        {% csrf_token %}
        <p><input type="submit" value="Change"></p>
    </form>
{% endblock %}
​

​

app/templates/registration/password_change_done.html

{% extends "base.html" %}
​
{% block title %}Password changed{% endblock %}
​
{% block content %}
    <h1>Password changed</h1>
    <p>Your password has been successfully changed.</p>
{% endblock %}

感谢您的帮助!

【问题讨论】:

  • 密码修改成功后是否使用重定向?你能显示代码吗?也许错误是必须是 'account:password_change_done' 但没有代码它只是一个猜测。
  • 嗨 Tobit,实际上是代码。在“urls.py”文件中,我使用的是“PasswordChangeView”视图,在查看 django 的默认视图后,它有一个默认为 reverse_lazy('password_change_done') 的 success_url 变量。也许我创建的命名空间造成了所有麻烦。在这里,您有函数和指向 Django 的默认身份验证视图的链接:github.com/django/django/blob/master/django/contrib/auth/… 在其中查找类 PasswordChangeView。谢谢

标签: python django authentication django-templates


【解决方案1】:

我认为这里的问题是,正如 Tobit 所暗示的,您的 URL 正在使用名为 account 的应用程序命名空间。这是由您的urls.py 中存在app_name = 'account' 定义的。

在查找 password_change_done 视图时,PasswordChangeView 不需要命名空间。但是,您可以通过指定显式的 success_url 属性来覆盖 urls.py 中的内容:

from django.urls import reverse_lazy
​
# change password urls
path('password-change/', auth_views.PasswordChangeView.as_view(success_url=reverse_lazy('account:password_change_done')), name='password_change'),

关于命名空间的更多信息:https://docs.djangoproject.com/en/2.0/topics/http/urls/#url-namespaces-and-included-urlconfs

【讨论】:

  • 如果我尝试您提出的解决方案,我会遇到此错误: path('password-change/', auth_views.PasswordChangeView.as_view(success_url=reverse_lazy('account:password_change_done')), name= 'password_change'), NameError: name 'reverse_lazy' 没有定义
  • 在导入 reverse_lazy 模块并编写解决方案后一切正常。非常感谢,威尔!
猜你喜欢
  • 2021-10-24
  • 2019-04-06
  • 2021-04-21
  • 2018-01-25
  • 2019-06-27
  • 2018-11-19
  • 2019-11-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多