Django确认密码验证器

11

我有一个个人设置页面,用户可以更改他们的密码并确认密码,如果他们这样做的话。我不能将其设置为必填字段,因为他们不必更改密码。是否有示例可以在密码字段不为空的情况下验证确认密码?然后再检查它们是否相等?我没有找到任何这样的示例...

1个回答

23
请将以下代码添加到表单的 clean 方法中:
def clean(self):
    password1 = self.cleaned_data.get('password1')
    password2 = self.cleaned_data.get('password2')

    if password1 and password1 != password2:
        raise forms.ValidationError("Passwords don't match")

    return self.cleaned_data

编辑

上面的验证错误消息将进入non_field_errors。您没有指定每个密码字段显示的错误消息,但根据上下文,我想象它是一个“此字段为必填项”的消息。如果是这种情况,请确保在定义表单字段时将required=False,或者如果您正在使用表单子类(无法编辑实际表单字段),则可以覆盖表单的__init__方法:

class MyForm(SomeOtherForm):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)

        self.fields['password1'].required = False
        self.fields['password2'].required = False

1
谢谢!在你编辑之前,我实际上已经找到了它。供其他人参考:https://docs.djangoproject.com/en/dev/ref/forms/validation/ - KVISH
我认为你实际上想要 if password1 and password1 != password2:,否则在password1中输入密码而在password2中什么也不输入将不会导致验证错误(假设你在两个字段上都有required=False,这对于“更改密码”表单来说很可能)。 - Anentropic
@Anentropic:好发现。我想我最初只是从注册表单中复制过来的,那里两个字段实际上都是必填项。 - Chris Pratt
密码2是用户模型的一部分还是它仅在表单中定义? - Noopur Phalak
我已经在表单中专门定义了verify_password字段,如下所示: verify_password = forms.CharField(widget=forms.PasswordInput()) 但是我无法让它起作用。 - Noopur Phalak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接