一、局部钩子

命名规则为clean_对象名称,例如上面定义了username、pwd对象,那么可以定义clean_username、clean_pwd的局部钩子进行规则校验

1、例子:定义一个手机号校验的局部钩子

def clean_phone(self):
value = self.cleaned_data.get('phone')
# 没有通过校验规则 抛出ValidationError
if not re.match(r'^1[3-9]\d{9}$',value):
raise ValidationError('手机号格式不正确')
# 通过校验规则 返回当前的值
return value

2、例子:定义局部钩子,判断部门名称是否已存在

from django import forms
from crm import models class DepartForm(forms.ModelForm):
class Meta:
model = models.Depart
fields = '__all__' error_messages = {
'depart_name': {
'required': '不能为空',
},
'depart_desc': {
'required': '不能为空',
}, } def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 批量更新class属性
for field in self.fields.values():
field.widget.attrs.update({'class': 'form-control'}) # 定义局部钩子,判断部门名称是否已存在
def clean_depart_name(self):
depart_name_new = self.cleaned_data.get('depart_name', None)
if not models.Depart.objects.filter(depart_name=depart_name_new).exists():
# 注意局部钩子返回的是要校验的这个值,全局钩子返回的是self.cleaned_data
return depart_name_new
# self.add_error('depart_name', '部门名称已存在!')
raise forms.ValidationError('部门名称已存在')

配置错误信息时,self.add_error和raise ValidationError这两种方法都可以
导入方法有2种
from django.forms import ValidationError  或者  from django.core.exceptions import ValidationError

抛出异常时使用ValidationError,则错误信息在__all__字典中,模板中通过{{form_obj.non_field_error.0}}获取错误信息
raise ValidationError('部门名称已存在')

如果使用self.add_error方法,则是给指定字段添加错误信息
self.add_error('depart_name', '部门名称已存在')

二、全局钩子

编写全局钩子预留的clean方法,可以获取到多个字段并进行校验

1、例子:定义一个校验2次输入密码是否一致的全局钩子

def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
# 通过校验 返回self.cleaned_data
if pwd == re_pwd:
return self.cleaned_data
# 没有通过校验 抛出ValidationError
# self.add_error('re_pwd','两次密码不一致!')
raise ValidationError('两次密码不一致') 前端可以通过fomr_obj.errors.__all__ 获取到内置校验器的全部错误信息 不能通过__all__来调取全局钩子的错误信息,需要通过对象的non_field_errors来获取错误信息列表
{{ form_obj.non_field_errors.0 }}

最新文章

  1. 使用WCF 创建 Rest service
  2. swift_初始化器的使用
  3. (转)Android网络命令
  4. Client-Side UI Automation Provider - WinForm Sample
  5. SimpleHttpServer的学习之UML
  6. Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)
  7. Nginx提示502和504错误的终极解决方案
  8. Eclipse背景和匹配出现单词的一些设置
  9. Android开发艺术1之Activity的生命周期
  10. linq 为什么要用linq linq写法
  11. 【JavaScript】事件捕获、事件冒泡与事件委托
  12. python之asyncio三种应用方法
  13. python基础之Day12
  14. Oracle 用户,角色,权限等
  15. Problem B 字符串类(I)
  16. Android与js交互拍照上传资料
  17. 【Python】web.py初识学习
  18. Android-LogUtil-工具类
  19. 【cocos2d-x 手游研发小技巧(5)获取网络图片缓存并展示】
  20. Git Pro Book

热门文章

  1. xc笔记
  2. 2019软件工程第二次作业(VS2017中对C++的单元测试)
  3. mysql 生成时间序列数据 - 存储过程
  4. operator用法:隐式类型转换
  5. YOLO理解
  6. sqlhelper类,C#事务入库
  7. Linux上静态库和动态库的编译和使用
  8. java8与函数编程资料
  9. spring声明式事务 同一类内方法调用事务失效(转)
  10. 2018-2019-2 20175236实验二《Java面向对象程序设计》实验报告