首页 > 解决方案 > PasswordChangeForm 永远无效,模板中始终存在错误消息

问题描述

我正在尝试在我的 Django 2.1.7 webapp 中实现密码更改功能。即使我使用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

标签: djangopython-3.xdjango-forms

解决方案


您可以使用类视图 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 方法之前手动运行这个方法???对不起,不能评论。没有足够的积分..


推荐阅读