• 自定义校验规则

    自定义校验规则

    假设我们已经发布了反馈页面了,email已经开始源源不断地涌入了。 这里有一个问题: 一些提交的消息只有一两个字,我们无法得知详细的信息。 所以我们决定增加一条新的校验: 来点专业精神,最起码写四个字,拜托。

    我们有很多的方法把我们的自定义校验挂在Django的form上。 如果我们的规则会被一次又一次的使用,我们可以创建一个自定义的字段类型。 大多数的自定义校验都是一次性的,可以直接绑定到form类.

    我们希望message 字段有一个额外的校验,我们增加一个clean_message() 方法到Form 类:

    1. from django import forms
    2. class ContactForm(forms.Form):
    3. subject = forms.CharField(max_length=100)
    4. email = forms.EmailField(required=False)
    5. message = forms.CharField(widget=forms.Textarea)
    6. def clean_message(self):
    7. message = self.cleaned_data['message']
    8. num_words = len(message.split())
    9. if num_words < 4:
    10. raise forms.ValidationError("Not enough words!")
    11. return message

    Django的form系统自动寻找匹配的函数方法,该方法名称以clean_开头,并以字段名称结束。 如果有这样的方法,它将在校验时被调用。

    特别地,cleanmessage()方法将在指定字段的默认校验逻辑执行 之后_ 被调用。(本例中,在必填CharField这个校验逻辑之后。)因为字段数据已经被部分处理,所以它被从self.cleaned_data中提取出来了。同样,我们不必担心数据是否为空,因为它已经被校验过了。

    我们简单地使用了len()和split()的组合来计算单词的数量。 如果用户输入字数不足,我们抛出一个forms.ValidationError型异常。这个异常的描述会被作为错误列表中的一项显示给用户。

    在函数的末尾显式地返回字段的值非常重要。 我们可以在我们自定义的校验方法中修改它的值(或者把它转换成另一种Python类型)。 如果我们忘记了这一步,None值就会返回,原始的数据就丢失掉了。