Skip to content
Advertisement

Django 2.0 – Reverse for ‘password_change_done’ not found. ‘password_change_done’ is not a valid view function or pattern name

I’m having this error message after trying to change my app’s password.

Do you have any idea of what’s causing this route to fail?

Actually, it is changing the password but it isn’t rendering the success template “password_change_done.html”.

Thanks!

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

​

ERROR MESSAGE

# 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:envdjango_social_websitelibsite-packagesdjangourlsresolvers.py in _reverse_with_prefix, line 632
# Python Executable:    C:envdjango_social_websiteScriptspython.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 %}

Thanks for your help!

Advertisement

Answer

I think the problem here is, as Tobit hints, is that your URLs are using an application namespace called account. That has been defined by the presence of app_name = 'account' in your urls.py.

The PasswordChangeView does not expect a namespace when looking up the password_change_done view. However, you can override that in your urls.py by specifying an explicit success_url attribute:

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

More info on namespaces: https://docs.djangoproject.com/en/2.0/topics/http/urls/#url-namespaces-and-included-urlconfs

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement