Как использовать встроенное представление "сброс пароля" в 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 %}
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.