Form组件的验证流程及扩展(钩子)
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组件的验证流程及扩展(钩子)的更多相关文章
- form组件的验证
django 的form组件可以实现自定义的验证规则. 创建基于Form的类,在类中创建字段,定义规则. 创建该类的对象,并将待验证的数据传入,使用is_valid()函数. is_valid()函数 ...
- Django【第16篇】:Django之Form组件自定义验证规则
自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...
- Django(十六)Form组件扩展
http://www.cnblogs.com/wupeiqi/articles/6144178.html Form组件 - form表单(验证:保留上次内容) - - Ajax(验证:无需上次内容) ...
- Django Form组件的扩展
Form组件扩展 1.用Form组件自带的正则扩展 通过Django内置的字段:Validators自定义验证规则 方式一: from django.forms import Form from dj ...
- Web框架django[Form]组件
新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 # 创 ...
- Django框架基础之Form组件
服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息 form组件的2大功能: 1 验证(显示错误信息) 2 保留用户上次输入 ...
- Python学习笔记整理总结【Django】:Form组件
Form组件 Django的Form主要具有一下几大功能: --生成HTML标签 --验证用户数据(显示错误信息) --HTML Form提交保留上次提交数据 --初始化页面显示内容 1.内置字段 ...
- Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合
Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合 一丶FORM的介绍 1.生成页面可用的HTML标签 2.对用户提交的 ...
- python---django中form组件(数据添加前使用自定义方法<django预留扩展点3个>进行验证,以及源码分析)
form组件代码: from app02.models import Userfrom django.core.exceptions import ValidationError class Ajax ...
随机推荐
- 自定义Swap
网上看到的一篇文章加深了对指针的了解,收藏一下 自定义的swap函数是一个老掉牙的问题,而这个问题对于理解指针和内存中的栈是很有帮助的 一般自定swap函数是这样的: 1.swap函数的功能是实现两个 ...
- windows cmd 新建和删除文件
1.新建文件夹 # 新建App文件夹 md app # 或者使用 mkdir mkdir app 2.新建文件 # 进入App文件夹cd app # 新建 index.js 文件 type nul&g ...
- Spark HA 配置中spark.deploy.zookeeper.url 的意思
Spark HA的配置网上很多,最近我在看王林的Spark的视频,要付费的.那个人牛B吹得很大,本事应该是有的,但是有本事,不一定就是好老师.一开始吹中国第一,吹着吹着就变成世界第一.就算你真的是世界 ...
- 洛谷P1655 小朋友的球(Stirling数)
P1655 小朋友的球 题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝 ...
- uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵加速)
传送门 uoj上的数据太毒了--也可能是我人傻常数大的缘故-- 三种血量的奴隶主加起来不超过\(8\)个,可以枚举每种血量的奴隶主个数,那么总的状态数只有\(165\)种,设\(dp_{t,i,j,k ...
- [Xcode 实际操作]七、文件与数据-(12)数据持久化存储框架CoreData的使用:查找CoreData中的数据
目录:[Swift]Xcode实际操作 本文将演示如何查找数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入数据持 ...
- JS动态append之后点击事件无效
今天做项目用了append向HTML里面添加结构代码,代码添加之后,单击事件就没反应了.搞得我一脸懵逼,调了代码很久实在不行,我百度了一下才发现,append添加的节点单击事件是不会生效的. 原因: ...
- $SCOJ4427 Miss Zhao's Graph$
\(problem\) 给定一个包含n个顶点m条边的带权有向图,找一条边数最多的路径,且路径上的边的权值严格递增. 图中可能有重边和自环. \(题意非常简单:n个点 m个带权边 最多能连成多少条边\) ...
- gedit配置
编辑 \(\rightarrow\) 首选项 \(\rightarrow\) 插件 \(\rightarrow\) 外部工具 启用 进入工具 \(\rightarrow\) Manage Extern ...
- Codeforces 183C(有向图上的环长度)
因为公用一个系统所以大家求gcd:衡量各点之间的拓扑位置,如果到达同一点有不同的长度则取gcd. #include <cstdio> #include <cstring> #i ...