PasswordChangeForm никогда не является допустимым, сообщения об ошибках всегда присутствуют в шаблоне

#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???
Извините, не могу прокомментировать. Недостаточно очков..