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 ...
随机推荐
- surface shader相关参数,命令
https://docs.unity3d.com/Manual/SL-SurfaceShaders.html 说明: 注意下surfaceshader相关开关选项,input结构体全部可用参数 goo ...
- Web项目开发介绍及实战项目介绍
引言 本系列课程我们将学些Golang语言中的Web开发框架Iris的相关知识和用法.通过本系列视频课程,大家能够从零到一经历一个完整项目的开发,并在课程中了解实战项目开发的流程和项目设涉及的各个模块 ...
- Glassfish 设置时区
对于Glassfish domain 或者instance下,某个日志的时区不对,前提是系统时区争取. 可以尝试通过如下命令查看jvm 时区设置 asadmin list-jvm-options 如果 ...
- iphone状态栏,导航栏,标签栏高度一览表
iphone状态栏,导航栏,标签栏高度一览表 设备分辨率 状态栏高度 导航栏高度 标签栏高度 iPhone6 plus 1242×2208 px 60px 132px 147px iPhon ...
- (转载)常用Git命令清单
我每天使用Git,但是很多命令记不住 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60~100个命令 下面是我整理的常用Git命令清单. Workspace:工作区 In ...
- CSS标签大全
CSS常用标签 字体属性:(font) 大小:font-size: x-large;(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 :font-styl ...
- SpringBoot---核心---基本配置
1.[入口类和@SpringBootApplication注解] 2.[关闭特定的配置] 3.[定制Banner] 1.1 修改Banner 1.2 关闭Banner 4.SpringBoot配置文件
- oracle 列转行
with temp as( as S3 from dual union all as S3 from dual ) select * from temp unpivot(Qty for Sizes i ...
- CM5.7.2 yum离线安装笔记
一.建立yum本地服务源(yum支持http和ftp两种协议,这里使用http协议) 1.启动httpd服务 启动命令:service httpd start 关闭命令:service ht ...
- ruby YAML.load 和YAML.load_file区别
1. load( io ) Load a document from the current io stream. File.open( 'animals.yaml' ) { |yf| YAML::l ...