【问题标题】:Django -- Password Clean fails when min_length is setDjango -- 设置 min_length 时密码清除失败
【发布时间】:2010-07-15 21:22:07
【问题描述】:

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

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

我尝试将“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

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

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

    相反,您应该尝试:

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

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

    顺便说一句,clean_myfieldname 方法应该只依赖一个字段。如果您想清理和验证相互依赖的字段,请为此使用clean 方法(请参阅django docs)。

    【讨论】:

    • 这就像一个冠军!另外,感谢您指出clean 方法。我做了相应的更改。
    【解决方案2】:

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

    【讨论】:

    • 对不起。我现在看到我的问题并不完全清楚。我希望密码字段按照您的描述进行验证,但它没有返回我的错误消息,而是给出了密钥错误。因此,如果我在密码字段中输入 3 位数字,并在确认密码字段中输入任何密码(匹配与否),而不是给我“没有足够的字符”错误,它会引发密钥错误。
    猜你喜欢
    • 2010-11-22
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多