我有一个帐户设置页面,用户可以在其中填写姓/名,用户名,电子邮件地址和电话号码。我也利用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())
任何提示?谢谢!
答案 0 :(得分:1)
看起来我发现了一个无证问题的解决方案。只需在定义表单时添加empty_permitted=True
作为参数,如下所示:
form3 = ChangePasswordForm(user=request.user, data=request.POST, empty_permitted=True)
这可以立即解决我在原始问题中提供的代码段中的代码问题。