用表单验证数据

常用的Field

使用Field可以是对数据验证的第一步。你期望这个提交上来的数据是什么类型,那么就使用什么类型的Field。

可以通过表单类实例.cleaned_data.get("field_name")获得值

CharField
用来接收文本。
参数:

max_length:这个字段值的最大长度。
min_length:这个字段值的最小长度。
required:这个字段是否是必须的。默认是必须的。
error_messages:在某个条件验证失败的时候,给出错误信息。

EmailField
继承于charField,用来接收邮件,会自动验证邮件是否合法。
错误信息的key:required、invalid。

FloatField
用来接收浮点类型,并且如果验证通过后,会将这个字段的值转换为浮点类型。
参数:

max_value:最大的值。
min_value:最小的值。
错误信息的key:required、invalid、max_value、min_value。

IntegerField
用来接收整形,并且验证通过后,会将这个字段的值转换为整形。
参数:

max_value:最大的值。
min_value:最小的值。
错误信息的key:required、invalid、max_value、min_value。

URLField
用来接收url格式的字符串。
错误信息的key:required、invalid。

常用验证器

from django.core import validators

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

MaxValueValidator:验证最大值。

MinValueValidator:验证最小值。

MinLengthValidator:验证最小长度。

MaxLengthValidator:验证最大长度。

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

URLValidator:验证是否是URL格式。

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

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

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

自定义验证

有时候对一个字段验证,需要一些其他复杂的逻辑,那么可以对该字段,进行自定义的验证。
比如在注册的表单验证中,想要验证手机号码是否已经被注册过了,那么这时候就需要在数据库中进行判断才知道。

对某个字段进行自定义的验证方式是,定义一个方法,这个方法的名字定义规则是:clean_fieldname。 如果验证失败,那么就抛出一个验证错误。

比如要验证用户表中手机号码之前是否在数据库中存在

# models.py
from django.db import modelsclass User(models.Model):username = models.CharField(max_length=100)phone = models.CharField(max_length=11)  # 这里没用unique是因为想使用下表单类判断 pwd = models.CharField(max_length=20)<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="" method="post"><table><tr><td>用户名:</td><td><input type="text" name="username"></td></tr><tr><td>手机号:</td><td><input type="text" name="phone"></td></tr><tr><td>密码:</td><td><input type="password" name="pwd"></td></tr><tr><td>重复密码:</td><td><input type="password" name="pwd_repeat"></td></tr><tr><td></td><td><input type="submit" name="提交"></td></tr></table></form></body>
</html>
from django import formsclass RegisterTable(forms.Form):username = forms.CharField(min_length=1,max_length=10)phone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}", message="请输入正确的手机号码")])  # message会在表单类.errors.get_json_data()中获得# 对某个字段进行自定义的验证方式是,定义一个方法,这个方法的名字定义规则是:clean_fieldnamedef clean_phone(self):phone = self.cleaned_data.get("phone")  # 获得字段数据ret = User.objects.filter(phone=phone).exists()  # 如果已存在if ret:raise forms.ValidationError(message="{}已经被注册".format(phone))  # 抛出异常# message会在表单类.errors.get_json_data()中获得else:return phone

如果验证数据时,需要针对多个字段进行验证,那么可以重写clean方法。

比如要在注册的时候,要判断提交的两个密码是否相等。那么可以使用以下代码来完成:

class RegisterTable(forms.Form):username = forms.CharField(min_length=1,max_length=10)phone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}", message="请输入正确的手机号码")])pwd = forms.CharField(min_length=5)  #密码pwd_repeat = forms.CharField(min_length=5)  #重复的密码def clean_phone(self):phone = self.cleaned_data.get("phone")  ret = User.objects.filter(phone=phone).exists()if ret:raise forms.ValidationError(message="{}已经被注册".format(phone))return phonedef clean(self):  #最后审查ret = super(RegisterTable, self).clean()pwd = ret.get("pwd") # ==self.cleaned_data.get("pwd")pwd_repeat = ret.get("pwd_repeat")if pwd != pwd_repeat:raise forms.ValidationError(message="密码不一致")else:return ret

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

form.errors:这个属性获取的错误信息是一个包含了html标签的错误信息。
form.errors.get_json_data():这个方法获取到的是一个字典类型的错误信息。将某个字段的名字作为key,错误信息作为值的一个字典。
form.as_json():这个方法是将form.get_json_data()返回的字典dump成json格式的字符串,方便进行传输。
上述方法获取的字段的错误值,都是一个比较复杂的数据。比如以下:

{'username': [{'message': 'Enter a valid URL.', 'code': 'invalid'}, {'message': 'Ensure this 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(): # key是表单字段, message_dicts是字段对应的值(一个list,里面保存错误的字典)messages = []for message in message_dicts:messages.append(message['message'])  # message键对应的值存储new_errors[key] = messages  # 保存表单字段的message键对应的值return new_errors

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

{'username': ['Enter a valid URL.', 'Ensure this value has at most 4 characters (it has 22).']}

Django2.0-表单(2)-表单的FIeld,验证器,提取错误字段相关推荐

  1. Angular响应式表单及表单验证

    1. 什么是响应式表单? 响应式表单提供了一种模型驱动的方式来处理表单输入,其中的值会随时间而变化. 响应式表单使用显示的,不可变的方式,管理表单在特定时间点上的状态.对表单状态的每一次变更都会返回一 ...

  2. angularjs 表单校验指令_angular4.0的模板式表单、响应式表单及其错误提示

    模板式表单 NgForm.NgModel.NgModelGroup是FormModule里的内容,NgForm会自动拦截标准的表单处理事件(eg.提交),angular用ngSubmit代替标准的表单 ...

  3. MySQL8.0 之SQL(DQL)单表、多表查询(详细回顾篇)

    今日重点:DQL 及学习要点与练习环境说明 DQL 是数据查询语言,用于查询数据,它是我们在真正的开发中使用最多的一种.而我们项目用 得最多的也是查询.而在 SQL 中, DQL 所占比例也是最大的, ...

  4. DJango周总结二:模型层,单表,多表操作,连表操作,数据库操作,事务

    django周复习二  1,模型层:   1单表操作:    13个必会操作总结     返回QuerySet对象的方法有     all()     filter()     exclude()   ...

  5. element 修改表单值后表单验证无效_javascript自学记录:表单脚本1

    第14章 表单脚本 14.1 表单的基础知识 ​获得表单元素: // 取得id为form_1的元素var form = document.getElementById("form_1&quo ...

  6. antd提交表单_表单序列化

    随着 Ajax 的出现,表单序列化已经成为一种常见需求.在 JavaScript 中,可 以利用表单字段的 type 属性,连同 name 和 value 属性一起实现对表单的序列化.在编写代码之前, ...

  7. ant4 多个form 验证_ant-design表单处理和常用方法及自定义验证操作

    首先要说一下antdesign这个框架API和demo丰富,而且开发环境提供对应的warning来纠正用户的错误.是一个很好的组件库. 关于表单验证方面是依赖于 async-validator 库.百 ...

  8. 物理机存放mysql实例原则_MySQL优化笔记(四)--表的设计与优化(单表、多表)...

    前面讲了SQL优化以及索引的使用.设计优化了,那么接下来就到表的设计与优化啦!!!真实地去设计优化单表结构以及讲述多表设计基本原则(结合真实的生产环境的取舍来讲述). 文章结构:(1)单表设计与优化: ...

  9. java非必填字段跳过校验,avalon2表单验证,非必填字段在不填写的时候不能通过验证...

    avalon2表单验证,非必填字段在不填写的时候不能通过验证 代码 var vm = avalon.define({ $id: "validate1", aaa : "& ...

最新文章

  1. golang gopsutil 进程 系统硬件 docker 信息获取
  2. jeasyui控件事件和方法的使用方法
  3. STL删除元素注意事项
  4. 前端 chrome查看html样式基本操作
  5. Linux虚拟机设备无法连接到它的理想主机控制器
  6. 各种排序笔记---基于比较排序部分
  7. 4 关卡流 进阶_全息武器全解析,记住4个点全区第一就是你!
  8. CSS之创建等高列布局之二
  9. Makefile学习之通配符和自动变量
  10. bash/shell编程学习(2)
  11. 吐槽贴:用ELECTRA、ALBERT之前,你真的了解它们吗?
  12. 即插即用+任意blur的超分辨率重建——DPSR
  13. Error:Comments are not permitted in JSON
  14. 重载全局new/delete实现内存检测
  15. 基于wemos d1 按键开锁
  16. SAI+PS超萌Q版插画手绘视频教程
  17. Java性能优化面试题汇总
  18. The APR based Apache Tomcat Native library which allows optimal performance in production
  19. 华为正式发布鸿蒙 2.0,更新人数太多挤爆服务器,P50 也官宣了!
  20. java基础代码练习

热门文章

  1. Flutter 多子 Widget 布之Stack、Positioned
  2. 学习笔记:Eclipse IDE for javaEE 64位下载安装
  3. 关于微信小程序过滤器filter的正确使用
  4. 几个高质量无版权图库,还愁找不到配图?
  5. 运算放大器的性能指标
  6. 95后沪漂女孩深陷“狠”且“卷”职场,向上思维,永不过时!
  7. Python中print换行问题
  8. Twitter Storm: DRPC学习
  9. poj 3399 Product
  10. Android后台Kill(二):ActivityManagerService与App现场恢复机制