Form组件的验证流程及扩展(钩子)

常用的form

class TestForm(Form):
t1 = fields.CharField(
widget=widgets.Textarea # 输入框
)
t2 = fields.CharField(
widget=widgets.CheckboxInput # 单选框
)
t3 = fields.MultipleChoiceField(
choices=[(1, '篮球'), (2, '足球')], # 多选框的内容
widget=widgets.CheckboxSelectMultiple # 多选框
)
t4 = fields.ChoiceField(
choices=[(1, '篮球'), (2, '足球')],
widget=widgets.RadioSelect # 单选 互斥
)
t5 = fields.FileField(
widget=widgets.FileInput # 文件 最终获得是文件对象
) def test(request):
obj = TestForm(initial={'t3': [2, ]}) # 多选的默认
return render(request, 'test.html', {'obj': obj})

前端

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ obj.t1 }}
{{ obj.t2 }}
{{ obj.t3 }}
{{ obj.t4 }}
{{ obj.t5 }}
</body>
</html>

Form组件的验证流程

关键点是返回值

  • 进行正则验证
  • 循环所有的字段,加入self.fields中并执行相应的函数clean_xxx,xxx是字段的名字
  • 自己定义的高级验证一定要有返回值,默认是自己

源码的寻找循序:

is_valid -> errors -> full_clean -> self._clean_fields()

源码中的full_clean

self._clean_fields()  # 对定义的字段函数进行验证
self._clean_form() # clean整体验证
self._post_clean() # 最后自定义验证 一般不适用,需要自己写错误验证

1 自定义函数进行验证

自定义的函数是对每个字段进行验证,

from django.core.exceptions import ValidationError

class TestForm(Form):
user = fields.CharField()
pwd = fields.CharField() def clean_user(self):
v = self.cleaned_data['user']
if models.Students.objects.filter(name=v).count():
raise ValidationError('用户名已经存在', code='invalid') # 默认是invalid 还可以是其他的required
else:
pass
return self.cleaned_data['user'] # 一定要有返回值 否则cleaned_data就是None,
# 没有改变就把自身返回 def clean_pwd(self):
return self.cleaned_data['pwd'] # self代表的是obj对象

2 整体验证

使用clean对整体进行验证,内部已经提供了异常处理

class TestForm(Form):
user = fields.CharField()
pwd = fields.CharField() def clean_user(self):
v = self.cleaned_data['user']
if models.Students.objects.filter(name=v).count():
raise ValidationError('用户名已经存在', code='invalid') # 默认是invalid 还可以是其他的required
else:
pass
return self.cleaned_data['user'] # 一定要有返回值 否则cleaned_data就是None,
# 没有改变就把自身返回 def clean_pwd(self):
return self.cleaned_data['pwd'] def clean(self):
user = self.cleaned_data.get('user')
email = self.cleaned_data.get('email')
if models.Students.objects.filter(user=user, email=email).count():
raise ValidationError('用户名和邮箱联合存在')
return self.cleaned_data

3 在默认正则中添加正则

需要导入一个模块

关键在validators=[],在内部添加正则,如第一个没有通过验证,后面的也就不用进行验证了

from django.core.validators import RegexValidator

class TestForm(Form):
# user = fields.CharField(validators=[])
user = fields.CharField(
validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
)
pwd = fields.CharField()

总结:

  • 字段 = 默认正则表达式

      额外的正则
    from django.forms import Form
    from django.forms import widgets
    from django.forms import fields
    from django.core.validators import RegexValidator class MyForm(Form):
    user = fields.CharField(
    validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
    )
  • clean_字段,必须返回值

  • clean()

    有返回值:cleaned_data = 返回值

    无返回值:cleaned_data = 原来的值

参考:

http://www.cnblogs.com/wupeiqi/articles/6144178.html

Form组件的验证流程及扩展(钩子)的更多相关文章

  1. form组件的验证

    django 的form组件可以实现自定义的验证规则. 创建基于Form的类,在类中创建字段,定义规则. 创建该类的对象,并将待验证的数据传入,使用is_valid()函数. is_valid()函数 ...

  2. Django【第16篇】:Django之Form组件自定义验证规则

    自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...

  3. Django(十六)Form组件扩展

    http://www.cnblogs.com/wupeiqi/articles/6144178.html Form组件 - form表单(验证:保留上次内容) - - Ajax(验证:无需上次内容) ...

  4. Django Form组件的扩展

    Form组件扩展 1.用Form组件自带的正则扩展 通过Django内置的字段:Validators自定义验证规则 方式一: from django.forms import Form from dj ...

  5. Web框架django[Form]组件

    新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 # 创 ...

  6. Django框架基础之Form组件

    服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息 form组件的2大功能:       1 验证(显示错误信息)       2 保留用户上次输入 ...

  7. Python学习笔记整理总结【Django】:Form组件

     Form组件  Django的Form主要具有一下几大功能: --生成HTML标签 --验证用户数据(显示错误信息) --HTML Form提交保留上次提交数据 --初始化页面显示内容 1.内置字段 ...

  8. Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合

    Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合 一丶FORM的介绍 1.生成页面可用的HTML标签 2.对用户提交的 ...

  9. python---django中form组件(数据添加前使用自定义方法<django预留扩展点3个>进行验证,以及源码分析)

    form组件代码: from app02.models import Userfrom django.core.exceptions import ValidationError class Ajax ...

随机推荐

  1. 特性attribute,声明和使用attribute,应用attribute,AOP面向切面,多种方式实现AOP

    1 特性attribute,和注释有什么区别2 声明和使用attribute3 应用attribute4 AOP面向切面5 多种方式实现AOP ---------------------------- ...

  2. cf808D(xjb)

    题目链接:http://codeforces.com/problemset/problem/808/D 题意:问能不能通过交换不超过两个元素的位置使得原数组变成能分成前,后和相等的连续两部分: 注意这 ...

  3. 前端面试题整理---JS基础

    为了督促自己学习,整理了一下前端的面试题 JavaScript: JavaScript 中如何监测一个变量是String类型? typeof(obj)==="string"; ty ...

  4. 填坑帖 By cellur925

    从今天到noip 记录下我犯的一切愚蠢错误. 7.17~7.19  把文件 注释掉了,输出语句放在了关文件之后 7.19           判断素数的板子 把%写成了& bool prime ...

  5. Luogu P3941 入阵曲【前缀和】By cellur925

    题目传送门 题目大意:给你一个\(n\)*\(m\)的矩阵,每个位置都有一个数,求有多少不同的子矩阵使得矩阵内所有数的和是\(k\)的倍数. 数据范围给的非常友好233,期望得到的暴力分:75分.前1 ...

  6. python爬虫——web前端基础(1)

    1.HTML的基本结构 <html>内容</html>:HTML文档是由<html></html>包裹,这是HTML文档的文档标记,也称为HTML开始标 ...

  7. mysql5.6数据库同步,单向双向同步问题

    windows下MySQL5.6实现主从数据库同步数据   mysql5.6数据库同步,单向双向同步问题 一.单向同步 主数据库(mysql5.6)192.168.1.104 从数据库(mysql5. ...

  8. go系列(6)- beego日志模块的使用

    1.安装日志模块 切换到工作目录,下载日志模块 cd /data/work/go/ go get github.com/astaxie/beego/logs 2.导入日志模块 使用的时候,需要导入模块 ...

  9. css各种水平垂直居中

    css各种水平垂直居中,网上查了一下,总结以下几种 line-height垂直居中 缺点,仅限于单行文字 .item{ text-align: center; height: 100px; line- ...

  10. ES6入门教程---解构赋值和字符串扩展

    解构赋值: ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 数组的解构赋值: 按照对应的顺序解构. var arr = [1,[2,3]]; ...