Django - 设置min_length时密码清除失败

时间:2010-07-15 21:22:07

标签: django django-models django-forms

我有一个用户注册表单,其中包含“密码”和“确认密码”字段。当我将“min_length”添加到我的密码字段,然后通过我的自定义clean_confirm_password方法运行提交的数据时,它会出现“密钥错误/密码”错误。

当密码字段少于5个字符时,无论confirm_password字段是否匹配,都会发生这种情况。

我尝试将“min_length”添加到“confirm_password”,但仍会出现相同的错误。

当我完全删除“min_length”时,一切正常。

任何帮助表示赞赏!

我的forms.py文件:

class NewUser(forms.Form):
    email = forms.EmailField(max_length=75)
    first_name = forms.CharField(max_length=45)
    last_name = forms.CharField(max_length=45)
    password = forms.CharField(min_length=5, max_length=30, widget=forms.PasswordInput(render_value=False))
    confirm_password = forms.CharField(max_length=30, widget=forms.PasswordInput(render_value=False))

    def clean_confirm_password(self):
        confirm_password = self.cleaned_data['confirm_password']
        original_password = self.cleaned_data['password']
        if original_password != confirm_password:
            raise forms.ValidationError("Password doesn't match")

        return confirm_password

2 个答案:

答案 0 :(得分:2)

当您提交少于5个字符的密码时,min_length验证失败,因此password不在您的表单的cleaned_data字典中。当您尝试访问缺少的密钥时,会得到KeyError

相反,你应该尝试:

original_password = self.cleaned_data.get('password', '')

如果密码太短,将返回''

另外,clean_myfieldname方法应该只依赖于一个字段。如果要清理和验证彼此依赖的字段,请使用clean方法(请参阅django docs)。

答案 1 :(得分:0)

当您访问self.cleaned_data时,表单会验证其所有字段,这会导致密码字段根据其min_length参数进行验证。