Как использовать встроенное представление "сброс пароля" в Django?

Я установил следующую запись в urls.py

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

но однажды я иду в http://127.0.0.1:8000/password_reset/ Я получаю сообщение об ошибке:

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

Я ожидал, что представление password_reset_done также выйдет из коробки. И что мне теперь делать?

обновление

попробовав решение Блэр, я подошел на шаг ближе.

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

согласно Книге "Разработка веб-сайта Django 1.0", эти встроенные представления следует использовать из коробки без лишних хлопот. Но, возможно, он изменился с Django 1.0... Было бы здорово, если бы кто-нибудь пролил свет на это. Спасибо

3 ответов


я, наконец, нашел решение. Я думаю, что всегда есть небольшое недоразумение между MVC и MTV pattern. В MTV (Django) вид означает контроллер, а шаблон-вид.

следовательно, в то время как его правда, что изменение пароля "представления" приходят встроенные из коробки, фактические шаблоны (look & feel) по-прежнему должны быть сгенерированы Пользователем, в то время как базовая форма (виджет) генерируется Django автоматически. Становится яснее, когда смотрю на код.

поэтому добавьте эти две строки в url.py

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

затем в разделе myproject / templates / registration добавьте эти два файла

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


Django должен знать, какой URL перенаправить пользователя, как только они заполнили форму на странице password_reset. Поэтому добавьте еще одну строку в конфигурацию URL:

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

по состоянию на django 1.11 password_change посмотреть устарела.

устарел с версии 1.11: представление на основе функции password_change должно быть заменено представлением на основе класса PasswordChangeView.

что работал для меня было:

в urls.py

from django.contrib.auth import views as auth_views
...
url('^account/change-password/$',
    auth_views.PasswordChangeView.as_view(
        template_name='registration/passwd_change_form.html'),
    name='password_change'),
url(r'^account/password-change-done/$',
    auth_views.PasswordChangeDoneView.as_view(
        template_name='registration/passwd_change_done.html'),
    name='password_change_done'),

а затем добавьте пару шаблонов passwd_change_form.HTML-код и passwd_change_done.HTML-код под Регистрация.

обратите внимание, что я не использую имя по умолчанию, по какой-то причине, когда я сделал это, он по умолчанию для представлений администратора django.