自定義表單字段驗證
表單驗證步驟
1.字段的to_python():數據轉換
2.字段的validate():特異性驗證
3.字段的run_validators():validators驗證
4.字段clean():按順序調用前3個
5.表單的clean_fieldname():自定義的驗證
6.表單的clean():表單多個字段的驗證
自定義字段:標簽字段
class MultiTagFeild(forms.Field):
def __init__(self, max_length=None, tag_max_length=None, strip=True, *args, **kwargs):
self.max_length = max_length
self.tag_max_length = tag_max_length
self.strip = strip
super(MultiTagFeild, self).__init__(*args, **kwargs)
if max_length is not None:
self.validators.append(validators.MaxLengthValidator(int(max_length)))
def to_python(self, value):
if not value:
return []
value = value.split(',')
if self.strip:
value = [smart_text(x.strip()) for x in value if x.strip()]
return value
def validate(self, value):
super(MultiTagFeild, self).validate(value)
for tag in value:
validators.MaxLengthValidator(self.tag_max_length, "標簽長度超限")(tag)
- 繼承forms.Field類,實現to_python方法
- validate()相關驗證
- validators驗證器
def forbidden_tags_validator(value):
forbidden_tags = ['you', 'are', 'a', 'sb']
for tag in value:
if tag.lower() in forbidden_tags:
raise ValidationError('you are a sb.')
class InvalidTagValidator(object):
def __init__(self, message=None):
if message:
self.message = message
def __call__(self, value):
for tag in value:
if '@' in tag or '+' in tag or '-' in tag:
raise ValidationError('Enter a valid tag.')
- clean_name()驗證和clean()驗證
# form類的方法
class CustomForm(forms.Form):
name = forms.CharField(max_length=100)
tags = MultiTagFeild()
def __init__(self, *args, **kwargs):
super(CustomForm, self).__init__(*args, **kwargs)
self.fields['tags'].validators.append(forbidden_tags_validator)
self.fields['tags'].validators.append(InvalidTagValidator)
def clean_name(self):
value = self.cleaned_data.get('name')
if value == "admin":
raise ValidationError('%s已存在' % value)
return value
def clean(self):
super(CustomForm, self).clean()
name = self.cleaned_data.get('name')
tags = self.cleaned_data.get('tags')
if not tags or len(tags) <= 1:
self._errors['tags'] = self.error_class(['標簽太少'])
if name == "help":
self.add_error("name", "幫助信息")
return self.cleaned_data