#django #python-3.x #django-forms
#django #python-3.x #django-forms
Вопрос:
Я пытаюсь реализовать функцию смены пароля в моем веб-приложении Django 2.1.7. Даже когда я использую GET
запрос на страницу смены пароля, эти две ошибки присутствуют в шаблоне:
Два поля пароля не совпадают. Ваш старый пароль был введен неправильно. Пожалуйста, введите его снова.
Кроме того, когда я POST
передаю данные с помощью формы, form.is_valid()
всегда возвращается false, хотя я могу подтвердить, что сообщения об ошибках (те же, что перечислены выше) являются ложными.
Страница формы не выдает сообщений об ошибках, если я не введу их вручную.
Я пробовал решение здесь и многие подобные. Насколько я могу судить, моя логика такая же.
Вид
def change_password(request):
args = {}
if request.method == "POST":
form = PasswordChangeForm(data=request.POST, user=request.user)
if form.is_valid():
form.save()
# Keep the user logged in after they change their password.
update_session_auth_hash(request, form.user)
return redirect("manager:profile")
else:
print("INVALID PASSWORD")
print(form.error_messages)
else:
form = PasswordChangeForm(request.user)
args["form"] = form
return render(request, "manager/change_password.html", args)
Шаблон
<head>
{% extends 'manager/base.html' %}
{% block title %}
Change Password: {{ user.username }}
{% endblock %}
</head>
{% block body %}
{% if form.error_messages %}
{% for error, error_message in form.error_messages.items %}
<b>{{ error_message }}</b><br>
{% endfor %}
{% endif %}
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<br>
<button class="btn grey darken-3" type="submit">Save Changes</button>
</form>
{% endblock %}
Как я могу:
1. Получить функцию смены пароля для правильной проверки?
2. Показывать ТОЛЬКО допустимые сообщения об ошибках, возникающие в результате POST
?
Комментарии:
1. Каков результат, если вы попытаетесь распечатать (form.errors) после сбоя form.is_valid()?
2.
INVALID PASSWORD
и{'password_mismatch': "The two password fields didn't match.", 'password_incorrect': 'Your old password was entered incorrectly. Please enter it again.'}
3. Ну вот и все, предоставленные вами пароли неверны.
4. Я могу подтвердить, что это не так. Я использовал «q» и «q» для моего нового пароля. Это должно вызвать ошибку, но не потому, что она не соответствует. Кроме того, я использую пароль, с которым я вошел в систему.
Ответ №1:
Вы могли бы использовать класс просмотра PasswordChangeView. Он предназначен для работы с PasswordChangeForm.
В вашей форме это может иметь какое-то отношение к:
# from PasswordChangeForm(SetPasswordForm):
def clean_old_password(self):
"""
Validate that the old_password field is correct.
"""
old_password = self.cleaned_data["old_password"]
if not self.user.check_password(old_password):
raise forms.ValidationError(
self.error_messages['password_incorrect'],
code='password_incorrect',
)
return old_password
может быть, запустите этот метод вручную перед методом form.is_valid???
Извините, не могу прокомментировать. Недостаточно очков..