一、局部钩子

命名规则为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. React 组件间通信介绍

    React 组件间通信方式简介 React 组件间通信主要分为以下四种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面对这四种情况分别进行介绍:   父组件向子 ...

  2. WebView 判断放大缩小操作

    using Android.App; using Android.Widget; using Android.OS; using Android.Content; using Android.Runt ...

  3. PythonStudy——闭包

    # closure:被包裹的函数,称之为闭包 # 完整的闭包结构:1.将函数进行闭包处理:2.提升函数名的作用域 # 案例:延迟加载 def get_site(url): #url='https:// ...

  4. Git自动化合并多个Commit

    目录 git rebase逻辑 git editor的修改 处理git-rebase-todo文件 Python实现 当我们有多个commit或者从开源处拿到多个commit时,想合成一个commit ...

  5. http请求方法之options请求方法

    需预检的请求”要求必须首先使用 OPTIONS   方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求. https://developer.mozilla.org/zh-CN/docs/W ...

  6. JWT(JSON Web Token) 【转载】

    JWT(JSON Web Token) 什么叫JWTJSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 一般来说,互联网用户认证是这样子的. 1.用户向服务器发送用户名和密码. ...

  7. 部署JupyterLab和pyalgotrade搭建web策略回测环境

    ==========================================================================安装anaconda 3 64位版本cd /optm ...

  8. 通过Spark Streaming的foreachRDD把处理后的数据写入外部存储系统中

    转载自:http://blog.csdn.net/erfucun/article/details/52312682 本博文主要内容包括: 技术实现foreachRDD与foreachPartition ...

  9. Laravel笔记--Eloquent 模型

    Eloquent 模型 默认继承use Illuminate\Database\Eloquent\Model类. 数据表名称与模型名称约定: 数据库的表名一般使用“蛇形命名法”命名.蛇形命名法要求单词 ...

  10. 使用Let's Encrypt搭建永久免费的HTTPS服务

    1.概述1.1 HTTPS概述HTTPS即HTTP + TLS,TLS 是传输层加密协议,它的前身是 SSL 协议.我们知道HTTP协议是基于TCP的.简而言之HTTPS就是在TCP的基础上套一层TL ...