如何在Django消息中显示PasswordResetForm错误

时间:2018-03-04 08:09:18

标签: python django django-forms django-views django-messages

我的页面有以下视图来重置密码:

from django.contrib.auth.forms import PasswordChangeForm

def password_change(request):

    if request.method == 'POST':
        password_form = PasswordChangeForm(data=request.POST, user=request.user)
        if password_form.is_valid():
            password_form.save()
            update_session_auth_hash(request, password_form.user)
            messages.add_message(request, messages.SUCCESS, "Password reset.")
            return redirect(reverse('elections:home'))
        else:
            messages.add_message(request, messages.ERROR, "Error with password reset.")
            return redirect('/password/new/')
    else:
        password_form = PasswordChangeForm(user=request.user)

    return render(request, 'registration/password_change.html', {
        'form': password_form
    })

我的一些用户报告他们无法更改密码,但这对我有用。由于显而易见的原因,我不能问他们他们的密码是什么,我需要向用户提供更多信息性的错误反馈。

据我了解,PasswordChangeForm会生成我可以访问的错误。这是真的,如果是这样,我如何在视图中访问这些错误以将它们添加到Django消息?如果没有,我如何创建自己的表单来返回这些错误?

2 个答案:

答案 0 :(得分:0)

未通过验证的Django表单字段条目引发ValidationError异常,因此您可以执行类似(Django 2.0)的操作:

try:
    if password_form.is_valid():
        password_form.save() # etc...
except ValidationError as e:
    messages.error(request, e)

答案 1 :(得分:-1)

您应该只能在模板中呈现表单错误。如果密码无效,您只需加载填充表单的页面即可。您可以通过删除form.is_valid()之后的else来完成此操作:

password_form = PasswordChangeForm(data=request.POST, user=request.user)
if password_form.is_valid():
    ...
else: #remove the else block here so that the filled form is rendered when there is an error

如果您手动呈现表单,请确保您已包含正确的错误标记,如下所述:https://docs.djangoproject.com/en/2.0/topics/forms/#rendering-fields-manually