Form field default cleaning表单域默认清理
我们首先创建一个自定义表单字段,验证其输入是一个包含逗号分隔的电子邮件地址的字符串。全班看起来像这样:
from django import forms
from django.core.validators import validate_email
class 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 forms
class 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