PasswordChangeForm недействителен, сообщения об ошибках всегда присутствуют в шаблоне - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь реализовать функцию смены пароля в моем веб-приложении Django 2.1.7. Даже когда я использую запрос GET для страницы смены пароля, эти две ошибки присутствуют в шаблоне:

Два поля пароля не совпадают. Ваш старый пароль был введен неправильно. Пожалуйста, введите его снова.

Кроме того, когда я POST данных с формой, form.is_valid() всегда возвращает ложь, хотя я могу подтвердить, что сообщения об ошибках (те же, что перечислены выше) являются ложными.

Страница формы не выдает сообщений об ошибках, если я не вставлю их вручную.

Я пробовал решение здесь и много подобных. Насколько я могу судить, моя логика такая же.

View

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)

Template

<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 Ответ

0 голосов
/ 10 апреля 2019

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

...