Django(十七): Form组件的错误反馈和自定义验证

错误反馈:
error_messages = {
'attr':'错误反馈',
'invalid': '格式错误', # 正则校验错误
}
e.g.
name = fields.CharField(
max_length=20,
widget=wid_01,
error_messages={
'required':'用户名不能为空',
'max_length':'用户名过长'
}
)

5. 自定义验证: validators = [], 自定义匹配规则
方式一: 使用django自带的正则匹配器
from django.core.validators import RegexValidator
ret = re.compile(r'正则表达式')
vat_01 = RegexValidator(ret,'错误反馈')
validators = [vat_01,..]

方式二: 使用djangoValidationError返回错误信息
def vat_01(value):
ret = re.complie(r'正则表达式')
if not ret.march(value):
raise ValidationError('错误反馈')
validators = [vat_01,..]

扩展: form.is_valid() -> self.errors -> self.full_clean()
Form组件验证过程: 1. 生成一个空的错误字典self._errors = ErrorDict(); 一个干净数据字典 self.cleaned_data = {}
2. self._clean_fields()
3. self._clean_form()
4. self._post_clean()

扩展一: self._clean_fields()
正则表达式验证 + 后端数据验证 (只能对当前字段进行验证)
Form组件的验证过程: 1. 逐一判断field正则表达式
2. 成功 self.cleaned_data['field_name'] = value
3. if hasattr(self,'clean_%' % field_name):
value = getattr(self,'clean_%' % name)()
self.cleaned_data[field_name] = value
class MyForm():
user = ...
def clean_user(self):
if models.User.objects.filter(name=user).count(): # 后端验证
raise ValidationError('用户名已存在') # 有错则抛出异常
return self.cleaned_data['user'] # 返回值固定

扩展二: self._clean_form
self._clean_fields()之后,进行联合验证
self._clean_form执行过程: 1. cleaned_data = self.clean()
2. self.cleaned_data = cleaned_data
self.clean()中可进行联合验证
def clean(self):
value_dict = self.cleaned_data # 获取已校验的数据
v1 = value_dict.get('user')
v2 = value_dict.get('id')
if v1 == 'root' and v2 == 1: # 进行联合验证
raise.ValidationError('联合验证失败') # 有错则抛出异常
return self.cleaned_data # 返回值固定
/***** 前端 ****/
form.errors = {
'__all__': '整体错误'
'users': users字段的错误
}
form.errors.__all__

扩展三: self._post_clean()全局扩展钩子

猜你喜欢

转载自www.cnblogs.com/lancelotxly/p/10872612.html