首页 > 其他 > 详细

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

时间:2019-05-16 00:06:11      阅读:122      评论:0      收藏:0      [点我收藏+]
错误反馈:
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()全局扩展钩子

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

原文:https://www.cnblogs.com/lancelotxly/p/10872612.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!