局部钩子:

在Fom类中定义 clean_字段名() 方法,就能够实现对特定字段进行校验。(校验函数正常必须返回当前字段值)

 def clean_name(self):

pass

        name = self.cleaned_data.get('name')

if name=='admin':

raise ValidationError('admin是超级管理员,不能注册!')#这个错误会直接扔进该字段的错误类别中:name.errors

        return self.cleaned_data.get('name')

全局钩子:

在Fom类中定义 clean() 方法,就能够实现对字段进行全局校验,字段全部验证完,局部钩子也全部执行完之后,

执行这个全局钩子校验(校验函数正常必须返回当前对象的结果值)。

# 全局钩子

    def clean(self):

register_dict = self.cleaned_data

print('>>>>>', register_dict)

if register_dict.get('password') != register_dict.get('r_password'):

raise ValidationError('密码不一致!')#由于是在全局非字段内校验,这个错误会扔给全局对象self中:self.erors

            self.add_error('r_password', '两次密码不一致!')#可以使用对象的add_error('字段''错误提示')进行指定

        else:

return self.cleaned_data

钩子实例:

from django import forms

from django.core.exceptions import ValidationError

class Registerform(forms.Form):

name = forms.CharField(

label='用户名:',

# required=True,

        max_length=10,

min_length=6,

help_text='只能由字符数字下划线组成,长度在610个字符'# 提示信息

        # initial='只能由字符数字下划线组成',#默认值

        error_messages={'required': '*必填项',

'max_length': '长度不能超过10',

'min_length': '至少6个字符', },

)

password = forms.CharField(

label='密码:',

max_length=12,

min_length=6,

error_messages={'required': '*必填项',

'max_length': '长度不能超过12',

'min_length': '至少6个字符', },

# widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'},render_value=True),

        widget=forms.PasswordInput(attrs={'class': 'form-control'}, render_value=True),

)

r_password = forms.CharField(

label='确认密码:',

max_length=12,

min_length=6,

error_messages={'required': '*必填项',

'max_length': '长度不能超过12',

'min_length': '至少6个字符', },

widget=forms.widgets.PasswordInput(attrs={'type':'password'},render_value=True)#密码验证出错时直接返回会自动清除内容,如果要保留,需设置render_value=True

    )

def __init__(self, *args, **kwargs):

super(Registerform, self).__init__(*args, **kwargs)

# print(self.fields)

        for filed in self.fields:

print('>>>>', filed)

self.fields[filed].widget.attrs.update({'class': 'form-control'})

# 局部钩子

    def clean_name(self):

pass

        name = self.cleaned_data.get('name')

if name=='admin':

raise ValidationError('admin是超级管理员,不能注册!')#这个错误会直接扔进该字段的错误类别中:name.errors

        return self.cleaned_data.get('name')

def clean_password(self):

pass

        return self.cleaned_data.get('password')

def clean_r_password(self):

pass

        return self.cleaned_data.get('r_password')

# 全局钩子

    def clean(self):

register_dict = self.cleaned_data

print('>>>>>', register_dict)

if register_dict.get('password') != register_dict.get('r_password'):

raise ValidationError('密码不一致!')#由于是在全局非字段内校验,这个错误会扔给全局对象self中:self.erors

            self.add_error('r_password', '两次密码不一致!')#可以使用对象的add_error('字段''错误提示')进行指定

        else:

return self.cleaned_data

Django之钩子Hook方法的更多相关文章

  1. 理解钩子Hook以及在Thinkphp下利用钩子使用行为扩展

    什么是钩子函数 个人理解:钩子就像一个”陷阱”.”监听器”,当A发送一个消息到B时,当消息还未到达目的地B时,被钩子拦截调出一部分代码做处理,这部分代码也叫钩子函数或者回调函数 参考网上说法 譬如我们 ...

  2. 框架Thinkphp5 简单的实现行为 钩子 Hook

    这篇文章主要介绍了关于框架Thinkphp5 简单的实现行为 钩子 Hook,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 实现在一个方法开始和结束加入两个行为:api_init.ap ...

  3. Django的DRF序列化方法

    安装rest_framework -- pip install djangorestframework -- 注册rest_framework序列化 -- Python--json -- 第一版 用v ...

  4. 钩子(hook)编程

    一.钩子介绍 1.1钩子的实现机制 钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术.下图是windows应用程序传递消息的过程: 如在键盘中按下一键,操作系 ...

  5. 钩子(hook)

    钩子(hook)编程     钩子(hook)编程 一.钩子介绍 1.1钩子的实现机制 钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术.下图是windows ...

  6. C# 钩子HOOK专题(1)

    目录   基本概念 运行机制 钩子类型 作者 基本概念   钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程 ...

  7. 闭包传参 余额计算 钩子hook 闭包中的this JavaScript 钩子

    闭包传参  余额计算    钩子hook 小程序 a=function(e){console.log(this)}() a=function(e){console.log(this)}() VM289 ...

  8. 如何正确的hook方法objc_msgSend · jmpews

    如何正确的hook方法objc_msgSend 前言 如果希望对 Objective-C 的方法调用进行 log, 一个很好的解决方法就是 hook 方法 objc_msgSend, 当然想到的就是利 ...

  9. CI框架源码阅读笔记6 扩展钩子 Hook.php

    CI框架允许你在不修改系统核心代码的基础上添加或者更改系统的核心功能(如重写缓存.输出等).例如,在系统开启hook的条件下(config.php中$config['enable_hooks'] = ...

随机推荐

  1. Maven+Jmeter+Jenkins的持续集成的新尝试

    前言: 这又是一篇迟到很久的文章,四月身体欠佳,根本不在状态. 好了,回到正题,相信大家也在很多博客,看过很多类似乎的文章,那么大家来看看我是如何实现的? 准备工作: 创建一个maven工程 创建一个 ...

  2. Java5-7作业总结(第八次作业)19201421-吴志越

    前言:关于此次三次作业,相比于前3次难度着实高了一个档次,第五次作业,虽然对于工具类没有很高.但是第一题的复杂程度很高,对于正则表达式有很高的要求,需要使用很多正则表达式的方法,而且不能有一处错误,对 ...

  3. Android MVP 十分钟入门!

    前言 在日常开发APP 的过程中,随着业务的扩展,规模的变化.我们的代码规模也会逐渐变得庞大,每一个类里的代码也会逐渐增多.尤其是Activity和Fragment ,由于Context 的存在,基本 ...

  4. 自定义fastjson对枚举类型的序列化及反序列化过程

    通常,fastjson在序列化及反序列化枚举时,一般以下几种策略: 1).根据枚举的name值序列化及反序列化(默认) 2).根据枚举的ordinal序列化及反序列化 3).根据枚举的toString ...

  5. C# 对 TCP 客户端的状态封装

    TCP客户端连接TCP服务器端有几种应用状态: 与服务器的连接已建立 与服务器的连接已断开 与服务器的连接发生异常 应用程序可按需求合理处理这些逻辑,比如: 连接断开后自动重连 连接断开后选择备用地址 ...

  6. JS编程建议——11:慎重使用伪数组

    建议11:慎重使用伪数组JavaScript没有真正的数组,因此typeof运算符不能辨别数组和对象.伪数组在JavaScript中有很高的易用性,程序员不用给它设置维度,而且永远不用担心产生越界错误 ...

  7. C++编程入门--No.6

    题目:用*号输出字母C的图案. 程序分析:可先用'*'号在纸上写出字母C,再分行输出. #include <bits/stdc++.h> using namespace std; int ...

  8. 2019 ICPC 银川网络赛 F-Moving On (卡Cache)

    Firdaws and Fatinah are living in a country with nn cities, numbered from 11 to nn. Each city has a ...

  9. Jenkins 源代码管理(SVN)

    Subversion 安装插件 1.首先将本地的自动化用例打包上传 svn 2.配置 jenkins 源代码管理(每次执行 jenkins 时,会自动 check-ou t配置地址中的代码到 Jenk ...

  10. Jenkins 节点配置

    1.配置代理 系统管理---configure Global Security(全局安全设置)---Tcp port for inbound agents---指定端口 服务器防火墙中开放此端口(li ...