基于 Django1.10 文档的深入学习(24)—— Form and field validation 之 cleaned_data

来源:互联网 发布:包装袋定制淘宝 编辑:程序博客网 时间:2024/06/06 04:21

Form field default cleaning表单域默认清理

我们首先创建一个自定义表单字段,验证其输入是一个包含逗号分隔的电子邮件地址的字符串。全班看起来像这样:

from django import formsfrom django.core.validators import validate_emailclass MultiEmailField(forms.Field):    def to_python(self, value):        “”“将数据规范化为字符串列表。”“”         #如果没有输入,返回一个空列表。        if not value:            return []        return value.split(',')    def validate(self, value):        “”“检查值是否仅由有效的电子邮件组成。”“”         #使用父母处理所需字段等。        super(MultiEmailField, self).validate(value)        for email in value:            validate_email(email)

使用此字段的每个表单都将运行这些方法,然后才能使用字段的数据完成任何其他操作。这是对这种类型的领域特定的清洁,无论它如何随后使用。

让我们创建一个简单的ContactForm来演示如何使用这个字段:

class ContactForm(forms.Form):    subject = forms.CharField(max_length=100)    message = forms.CharField()    sender = forms.EmailField()    recipients = MultiEmailField()    cc_myself = forms.BooleanField(required=False)

像任何其他表单字段一样使用MultiEmailField。当窗体上调用了is_valid()方法时,MultiEmailField.clean()方法将作为清理过程的一部分运行,它将依次调用自定义to_python()validate()方法。


Cleaning a specific field attribute清理特定字段属性

从上一个例子继续,假​​设在我们的ContactForm中,我们要确保收件人字段始终包含地址“fred@example.com”。这是对我们的表单特定的验证,所以我们不想把它放在一般的MultiEmailField类中。相反,我们编写一个在收件人字段上运行的清理方法,如下所示:

from django import formsclass ContactForm(forms.Form):    # Everything as before.    ...    def clean_recipients(self):        data = self.cleaned_data['recipients']        if "fred@example.com" not in data:            raise forms.ValidationError("你忘了弗雷德了!")        #始终返回一个值作为新的清除数据,即使这种方法没有改变它。        return data
0 0
原创粉丝点击