【问题标题】:Allow Django required form field to pass validation when left blank?留空时允许 Django 所需的表单字段通过验证吗?
【发布时间】:2012-09-21 21:12:13
【问题描述】:

我有一个帐户设置页面,用户可以在其中填写他的名字/姓氏、用户名、电子邮件地址和电话号码。我还利用 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())

有什么建议吗?谢谢!

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    看起来我为自己的问题找到了一个未记录的解决方案。只需在定义表单时添加empty_permitted=True作为参数,如下所示:

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

    这立即解决了我在原始问题中提供的 sn-p 中的代码问题。

    【讨论】:

    • 最好还是使用文档化解决方案,并使用clean 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多