ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-05-15 22:43:15  阅读:162  来源: 互联网

标签:自定义 Form self cleaned value Django clean ._ data


错误反馈:
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,..]

方式二: 使用django的ValidationError返回错误信息
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()全局扩展钩子

标签:自定义,Form,self,cleaned,value,Django,clean,._,data
来源: https://www.cnblogs.com/lancelotxly/p/10872612.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有