允许Django所需的表单字段在留空时通过验证?

时间:2012-09-21 21:12:13

标签: django django-forms django-views

我有一个帐户设置页面,用户可以在其中填写姓/名,用户名,电子邮件地址和电话号码。我也利用Django提供的PasswordChangeForm让用户使用相同的单一形式更改密码。

我希望用户可以更改其个人详细信息,例如他们的电子邮件地址或电话号码,而无需填写“旧密码”,“新密码”,并重复“新密码” 。 (例如,WordPress配置文件设置页面以这种方式工作。)

只有当其中一个或多个密码字段不为空时,才应验证这三个密码字段。

当其中一个字段出错时,在我的views.py中执行以下操作仍会引发密码字段的格式错误。

@sensitive_post_parameters()
@csrf_protect
@login_required
def account(request):
    if request.method == "POST":
        form1 = AccountDetailsForm(request.POST, instance=request.user)
        form2 = AccountPhoneNumber(request.POST, instance=request.user.get_profile())
        form3 = ChangePasswordForm(user=request.user, data=request.POST)
        if form1.is_valid() and form2.is_valid():
            if form3.has_changed():
                if form3.is_valid():
                    form1.save()
                    form2.save()
                    form3.save()
                    messages.success(request, 'Accont Settings and Password Saved.')
                    return redirect('account')
            else:
                form1.save()
                form2.save()
                messages.success(request, 'Account Settings Saved.')
                return redirect('account')
    else:
        form1 = AccountDetailsForm(instance=request.user)
        form2 = AccountPhoneNumber(instance=request.user.get_profile())
        form3 = ChangePasswordForm(user=request.user)
    return render(request, 'account.html', locals())

任何提示?谢谢!

1 个答案:

答案 0 :(得分:1)

看起来我发现了一个无证问题的解决方案。只需在定义表单时添加empty_permitted=True作为参数,如下所示:

form3 = ChangePasswordForm(user=request.user, data=request.POST, empty_permitted=True)

这可以立即解决我在原始问题中提供的代码段中的代码问题。