Django def clean()函数对表单中的数据进行验证操作


Posted in Python onJuly 09, 2020

最近写的资源策略管理,在ceilometer 中创建alarm时,name要求是不能重复的,所以在创建policy的时候,要对policy的name字段进行验证,而django中正好拥有强大的表单数据验证的功能。

#这是policy中的name字段,在表单的数据进行提交的时候,所有的数据流会经过clean()这个函数

name = forms.CharField(max_length=255, label=_("Name"))

#在clean函数中先取出表单中的name字段,在从数据库里面拿到所有的数据进行检查

  def clean(self):
    cleaned_data = super(CreatePolicyForm, self).clean()
    name = cleaned_data.get('name')

    try:
      policys = api.nova.policy_list(self.request)
    except:
      exceptions.handle(request,
               _('Unable to retrieve policys list.'))
    if policys is not None and name is not None:
      for policy in policys:
        if policy.name.lower() == name.lower():
          raise forms.ValidationError(
            _('The name "%s" is already used by another policy.')
            % name
          )
    return cleaned_data

补充知识:django中关于表单自定义验证器和常用验证器

常用验证器:

在验证某个字段的时候,可以传递一个 validators 参数用来指定验证器,进一步对数据进行过滤。验证器有很多,但是很多验证器我们其实已经通过这个 Field 或者一些参数就可以指定了。比如 EmailValidator ,我们可以通过 EmailField 来指定,比如 MaxValueValidator ,我们可以通过 max_value 参数来指定。

以下是一些常用的验证器:

1. MaxValueValidator :验证最大值。

2. MinValueValidator :验证最小值。

3. MinLengthValidator :验证最小长度。

4. MaxLengthValidator :验证最大长度。

5. EmailValidator :验证是否是邮箱格式。

6. URLValidator :验证是否是 URL 格式。

7. RegexValidator :如果还需要更加复杂的验证,那么我们可以通过正则表达式的验证

器: RegexValidator 。比如现在要验证手机号码是否合格,那么我们可以通过以下代码实

现:

class MyForm(forms.Form):

telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])

自定义验证:

有时候对一个字段验证,不是一个长度,一个正则表达式能够写清楚的,还需要一些其他复杂的逻辑,那么我们可以对某个字段,进行自定义的验证。比如在注册的表单验证中,我们想要验证手机号码是否已经被注册过了,那么这时候就需要在数据库中进行判断才知道。对某个字段进行自定义的验证方式是,定义一个方法,这个方法的名字定义规则是: clean_fieldname 。如果验证失败,那么就抛出一个验证错误。比如要验证用户表中手机号码之前是否在数据库中存在,那么可以通过以下代码实现:

class MyForm(forms.Form):
telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])

def clean_telephone(self):


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


exists = User.objects.filter(telephone=telephone).exists()


if exists:



raise forms.ValidationError("手机号码已经存在!")


else:



return telephone

以上是对某个字段进行验证,如果验证数据的时候,需要针对多个字段进行验证,那么可以重写 clean 方法。比如要在注册的时候,要判断提交的两个密码是否相等。那么可以使用以下代码来完成:

class MyForm(forms.Form):
telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])

pwd1 = forms.CharField(max_length=12)

pwd2 = forms.CharField(max_length=12)

def clean(self):


cleaned_data = super().clean()


pwd1 = cleaned_data.get('pwd1')


pwd2 = cleaned_data.get('pwd2')


if pwd1 != pwd2:



raise forms.ValidationError('两个密码不一致!')

提取错误信息:

如果验证失败了,那么有一些错误信息是我们需要传给前端的。这时候我们可以通过以下属性来获取:

1. form.errors :这个属性获取的错误信息是一个包含了 html 标签的错误信息。

2. form.errors.get_json_data() :这个方法获取到的是一个字典类型的错误信息。将某个字段的名字作为 key ,错误信息作为值的一个字典。

3. form.as_json() :这个方法是将 form.get_json_data() 返回的字典 dump 成 json 格式的字符串,方便进行传输。

4. 上述方法获取的字段的错误值,都是一个比较复杂的数据。比如以下:

{'username': [{'message': 'Enter a valid URL.', 'code': 'invalid'}, {'message': 'Ensurethis value has at most 4 characters (it has 22).', 'code': 'max_length'}]}

那么如果我只想把错误信息放在一个列表中,而不要再放在一个字典中。这时候我们可以定义一个方法,把这个数据重新整理一份。实例代码如下:

class MyForm(forms.Form):
username = forms.URLField(max_length=4)

def get_errors(self):


errors = self.errors.get_json_data()


new_errors = {}


for key,message_dicts in errors.items():



messages = []



for message in message_dicts:




messages.append(message['message'])



new_errors[key] = messages


return new_errors

这样就可以把某个字段所有的错误信息直接放在这个列表中。

以上这篇Django def clean()函数对表单中的数据进行验证操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python操作ie登陆土豆网的方法
May 09 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 Python
python3+selenium自动化测试框架详解
Mar 17 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
python实现图片中文字分割效果
Jul 22 Python
python利用7z批量解压rar的实现
Aug 07 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
Mar 06 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 Python
Python 随机按键模拟2小时
Dec 30 Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 Python
浅谈Python列表嵌套字典转化的问题
Apr 07 Python
django form和field具体方法和属性说明
Jul 09 #Python
浅谈Python里面None True False之间的区别
Jul 09 #Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 #Python
在CentOS7下安装Python3教程解析
Jul 09 #Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 #Python
Python使用xlrd实现读取合并单元格
Jul 09 #Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 #Python
You might like
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
jQuery中each循环的跳出和结束实例
2017/08/16 jQuery
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
深入讲解Java编程中类的生命周期
2016/02/05 Python
Django URL传递参数的方法总结
2016/08/28 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
Python zip()函数用法实例分析
2018/03/17 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
Python 处理图片像素点的实例
2019/01/08 Python
python打开使用的方法
2019/09/30 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
通过实例解析python and和or使用方法
2020/11/14 Python
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
EJB的基本架构
2016/09/22 面试题
公务员职业生涯规划书范文  
2014/01/19 职场文书
2014婚礼司仪主持词
2014/03/14 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
申请吧主发表的感言
2015/08/03 职场文书