Search code examples
pythondjangodjango-1.4

How to use the built-in 'password_reset' view in Django?


I have set the following entry in the urls.py

(r'^password_reset/$', 'django.contrib.auth.views.password_reset'),

but once I go to http://127.0.0.1:8000/password_reset/ I get the error message:

NoReverseMatch at /password_reset/
Reverse for 'django.contrib.auth.views.password_reset_done' with arguments '()' and keyword arguments '{}' not found.

I was expecting password_reset_done view also to be coming out of the box. So what am I supposed to do at this stage?

UPDATE

After trying Blair's solution, I got a step closer.

(r'^password_reset_done/$', 'django.contrib.auth.views.password_reset_done'),

According to the book 'Django 1.0 Website Development', these built-in views should be used out of the box without further hassle. But maybe it has changed since Django 1.0... Would be great if someone could shed light on this. Thanks


Solution

  • I have finally found the solution. I think there is always the slight misunderstanding between MVC and MTV pattern. In MTV (Django) the View stands for the controller and the Template stands for the View.

    Hence while its true that the change password "Views" are coming built-in out-of-the-box, the actual templates (look & feel) still needs to be generated by the user while the underlying form (widget) is generated by Django automatically. It gets more clear when looking at the code.

    Therefore add these two lines to url.py

    (r'^change-password/$', 'django.contrib.auth.views.password_change'), 
    (r'^password-changed/$', 'django.contrib.auth.views.password_change_done'),
    

    Then Under myproject/templates/registration add these two files

    password_change_done.html

    {% extends "base.html" %}
    {% block title %}Password Change Successful{% endblock %}
    {% block head %}Password Change Completed Successfully{% endblock %}
    {% block content %}
        Your password has been changed successfully. Please re-login with your new credentials 
        <a href="/login/">login</a> or go back to the
        <a href="/">main page</a>.
    {% endblock %}
    

    password_change_form.html

    {% extends "base.html" %}
    {% block title %}Change Registration{% endblock %}
    {% block head %}Change Registration{% endblock %}
    {% block content %}
        <form method="post" action=".">
            {{form.as_p}}
            <input type="submit" value="Change" />
            {% csrf_token %}
        </form>
    {% endblock %}
    

    enter image description here