一、局部钩子

命名规则为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 }}

Django12-ModelForm中创建局部钩子和全局钩子的更多相关文章

  1. Django学习笔记(14)——AJAX与Form组件知识补充(局部钩子和全局钩子详解)

    我在之前做了一个关于AJAX和form组件的笔记,可以参考:Django学习笔记(8)——前后台数据交互实战(AJAX):Django学习笔记(6)——Form表单 我觉得自己在写Django笔记(8 ...

  2. Django框架(十四)-- forms组件、局部钩子、全局钩子

    一.什么是forms组件 forms组件就是一个类,可以检测前端传来的数据,是否合法. 例如,前端传来的邮箱数据,判断邮件格式对不对,用户名中不能以什么开头,等等 二.forms组件的使用 1.使用语 ...

  3. Django框架(十五)—— forms组件、局部钩子、全局钩子

    目录 forms组件.局部钩子.全局钩子 一.什么是forms组件 二.forms组件的使用 1.使用语法 2.组件的参数 3.注意点 三.渲染模板 四.渲染错误信息 五.局部钩子 1.什么是局部钩子 ...

  4. form表单钩子,局部钩子和全局钩子

    form表单源码解析: 局部钩子: 全局钩子:

  5. git自定义项目钩子和全局钩子

    钩子介绍 自定义钩子分为:项目钩子和全局钩子 自定义全局钩子: 全局钩子目录结构: (注意:excludes目录结构是我们自定义的目录,规则逻辑在update.d/update.py脚本里实现的,非g ...

  6. form(form基础、标签渲染、错误显示 重置信息、form属性、局部钩子、全局钩子)

    form基础 Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from django im ...

  7. django----利用Form 实现两次密码输入是否一样 ( 局部钩子和全局钩子 )

    from django import forms # 导入表单模块 from django.core.exceptions import ValidationError class RegisterF ...

  8. ModelForm错误验证自定义钩子和全局钩子

    当需要对model_class中字段作进一步验证,作进一步的约束时,需要使用到钩子,即claan_xxx和clean方法.其返回的errors有点不是那么好处理.看示例.   1.Model_clas ...

  9. Django学习笔记之form组件的局部钩子和全局钩子

    本文通过注册页面的form组件,查看其中使用的全局钩子和局部钩子. # Create your views here. class RegForm(forms.Form): username = fo ...

随机推荐

  1. jQuery事件合成

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  2. JAVA基础搬运工

    1Java线程的6种状态及切换 https://blog.csdn.net/pange1991/article/details/53860651/ 2进程和线程的区别 https://www.cnbl ...

  3. javascript将C#json序列化的Date对象转换成正常的Date格式

    function ChangeDateFormat(cellval) { var date = new Date(parseInt(cellval.replace("/Date(" ...

  4. linux系统如何发送邮件

    安装应用yum install mailx  sendmail -y接着修改/etc/mail.rc文件,添加一下参数#末尾添加 zabbix 发送告警信息邮箱(按照自己的情况修改)set from= ...

  5. 【备份】如何在 PADS Layout 中选择 Gerber 274X 格式

    如何在 PADS Layout 中选择 Gerber 274X 格式. 起初原因是 JLC 说 274X 和 274D 的差别. 有小伙伴使用了 274D 的格式,结果做出来的 PCB 有问题.

  6. jQuery实现的3个基础案例(仿QQ列表分组,二级联动下拉框,模拟员工信息管理系统)

    1.仿QQ列表分组 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&quo ...

  7. cocos2dx lua invalid 'cobj' in function 'lua_cocos2dx'

    解决方法 在创建 Node节点后 调用父节点 retain() 方法 手动增加引用 一般调用:clone()方法会出现,在变量后面加上对一个对应的retain() 方法

  8. HashMap与LinkedHashMap的区别

    /**         * remark:         * HashMap与LinkedHashMap的区别         * 这里必须使用LinkedHashMap:         * 原因 ...

  9. 用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)

    用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书) 来源: https://www.cnblogs.com/osnosn/p/10597897.html 来自osnosn的博客 ...

  10. [蓝桥杯]PREV-27.历届试题_蚂蚁感冒

    问题描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂 ...