0

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

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 消息中?如果没有,我如何创建自己的表单来返回这些错误?

4

2 回答 2

0

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

try:
    if password_form.is_valid():
        password_form.save() # etc...
except ValidationError as e:
    messages.error(request, e)
于 2018-03-04T14:26:13.387 回答
-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

于 2018-03-04T09:12:27.467 回答