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()全局扩展钩子

转载于:https://www.cnblogs.com/lancelotxly/p/10872612.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值