0

我有一个帐户设置页面,用户可以在其中填写他的名字/姓氏、用户名、电子邮件地址和电话号码。我还利用PasswordChangeFormDjango 提供的功能让用户使用相同的单一表单更改密码。

我想让用户可以更改他们的个人详细信息,例如他们的电子邮件地址或电话号码,而无需填写“旧密码”、“新密码”和重复“新密码”。(例如,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())

有小费吗?谢谢!

4

1 回答 1

1

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

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

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

于 2012-09-22T04:37:52.673 回答