为什么我在clean函数中无法访问self.cleaned_data的值?

时间:2012-05-31 21:51:35

标签: django django-forms

我为我的Django表单写了一个干净的函数。我将上面的OPTIONAL_PASSWORD_INPUTOPTIONAL_REPEAT_PASSWORD_INPUT定义为密码输入字段:

class addNewMemberForm(SignUpForm):
    username = forms.SlugField(required=False, 
                   min_length=MIN_USER_NAME, 
                   max_length=MAX_USER_NAME, 
                   label="Username (optional)", 
                   help_text="If left empty, we will generate a username for you."
    )
    password = OPTIONAL_PASSWORD_INPUT
    password2 = OPTIONAL_REPEAT_PASSWORD_INPUT

    def clean(self):

        # if user name is filled out, so must be the password field.
        if self.data["username"] and not self.data["password"]:
            raise forms.ValidationError("If you specify a username, you must specify a password.")

        return self.cleaned_data

    def __init__(self, *args, **kwargs):
        super(SignUpForm, self).__init__(*args, **kwargs)
        self.fields.keyOrder = uniqueify(['username', 'email'] + self.fields.keyOrder)

如果我将if self.data["username"] and not self.data["password"]:更改为if self.cleaned_data["username"] and not self.cleaned_data["password"]:,Django会为“用户名”生成关键错误。

为什么我可以访问self.data数组的值,而不是我的clean函数中self.cleaned_data数组的值?

另一方面,这个问题是否重要?我可以使用self.data吗?

1 个答案:

答案 0 :(得分:0)

在调用form.clean之前完成单个字段验证和清理。仅当输入的数据有效时,才会将username添加到cleaning_data。这意味着您应该使用self.cleaned_data.get或者检查self.errors早期是否有任何错误,只需保留额外的验证,如果单个字段无效,则可能不需要保释。