Django_Form验证(三)字段,字段的参数,widgets种类
Form工具是一个很强大的工具,所以他的功能不仅仅是上面2个例子,这里详细记录一下Form的其他功能
字段的一般参数,以CharFields为列子:
- user=fields.CharField(
- required=True, #是否必填
- label="sb", #生成label标签,用法:{{对象.字段名字.label_tag}}
- initial="用户名", #默认值
- error_messages={"invalid":"无效的输入"}, #订制那种错误显示那种信息
- show_hidden_initial="用户名", #在当前的标签后面生成一个隐藏的默认值标签,可用于判断用户时候修改了值.
- disabled=True, #不可编辑
- label_suffix="" #label标签的后缀
- )
自定义验证参数validators:
- from django.core.validators import RegexValidator
- phone=fields.CharField(
- validators=[RegexValidator(r'^[0-9]+$',"phone Formaterror"),RegexValidator(r'^159[0-9]+$',"phone error")]
- )
- age=fields.CharField(
- validators=[RegexValidator(r'^[0-9]+$',message='age error',code='c1')],
- error_messages={'c1':"xxxx"}#会优先显示xxx
- )
CharField下的特殊参数:
- #默认获取到的是字符串
- char=fields.CharField(
- # 最大最小值
- max_length=6,
- min_length=2,
- )
数字类型字段下的特殊参数:
- #默认获取到的是数字类型
- Integer=fields.IntegerField(
- max_value=10,
- min_value=2
- )
- # 浮点型:
- Float=fields.FloatField(
- max_value=10,
- min_value=2
- )
- #高级浮点型:
- Decimal=fields.DecimalField(
- max_value=10,
- min_value=2,
- max_digits=None, #总长度限定
- decimal_places = None, #小数点后限定
- )
RegexField字段,自定义验证规则,和validaotrs效果一样,只是这里是字段,拿到的也是字符串
- re=fields.RegexField(
- regex=r"^123",
- max_length=10,
- min_length=2,
- error_messages={"invalid":"操操操"}
- )
EmailFields字段,内部也是正则匹配
- eMail=fields.EmailField(
- )
文件字段:
- file=fields.FileField(
- allow_empty_file=True#文件是否允许为空
- )
- #需要安装模块 pip3 install Pillow
- #因为是文件,获取方式是request.files获取,所以在创建Form对象的时候#要传入request.Files
- #HTMl中要加入编码方式:
- #enctype="multipart/form-data"
- #文件路径,生成select框,拿到数据默认为字符串
- filepath=fields.FilePathField(
- path="fff",#路径
- match=r".py$",#匹配规则
- recursive=True,#是否递归文件夹
- allow_folders=True,#是否允许显示文件夹
- )
选择类型字段:
- # 默认生成select框
- choice=fields.ChoiceField(
- choices=[(1,"擦"),(2,"fuck")]
- )
- #其实Choice拿到的数据是str类型的,他的本质就是
- choicechar=fields.CharField(widget=widgets.Select( choices=[(1,"擦"),(2,"fuck")]))
- choiceint=fields.IntegerField(widget=widgets.Select( choices=[(1,"擦"),(2,"fuck")]))
- typechoice=fields.TypedChoiceField(
- coerce=lambda x:int(x),#可将得到的类型转换为自定义类型
- initial=2,#默认选中2
- choices=[(1, "擦"), (2, "fuck")]#生成的select框中value就是1,2
- )
- #这里得到的是[1,2,3]
- mulchoice=fields.MultipleChoiceField(
- initial=[2,"sb"], # 默认选中2,3
- choices=[(1, "擦"), (2, "fuck"),(3,""),("sb","It is me")] #这里写可迭代对象, 生成的select框中value就是1,2
- )
多重验证,即一个字段可以验证多个内容:
- multauth=fields.ComboField(
- fields=[fields.CharField(max_length=20), fields.EmailField(),]
- )
widgets:
字段分成这么多中类别,主要就是widgets参数默认值不一样,widgets可以让字段指定生成那种标签:
- TextInput(Input)
- NumberInput(TextInput)
- EmailInput(TextInput)
- URLInput(TextInput)
- PasswordInput(TextInput)
- HiddenInput(TextInput)
- Textarea(Widget)
- DateInput(DateTimeBaseInput)
- DateTimeInput(DateTimeBaseInput)
- TimeInput(DateTimeBaseInput)
- CheckboxInput
- Select
- NullBooleanSelect
- SelectMultiple
- RadioSelect
- CheckboxSelectMultiple
- FileInput
- ClearableFileInput
- MultipleHiddenInput
- SplitDateTimeWidget
- SplitHiddenDateTimeWidget
- SelectDateWidget
具体介绍几个简单列子:
- # 单选框
- s1=fields.CharField(
- initial=2,
- widget=widgets.Select(choices=[(1,"小兔"),(2,"小龙"),(3,"垃圾")]),
- )
- s2=fields.ChoiceField(
- initial=2,
- choices=[(1,"小兔"),(2,"小龙"),(3,"垃圾")],
- )
- # 多选框:
- s3=fields.MultipleChoiceField(
- initial=[1,2],
- choices=[(1, "小兔"), (2, "小龙"), (3, "垃圾")],
- )# 获取到数据是[1,2],是列表
- s4=fields.CharField(
- initial=[1,2],
- widget=widgets.SelectMultiple(choices=[(1, "小兔"), (2, "小龙"), (3, "垃圾")])
- )#获取到的是一个'[1,2]'的字符串
小应用:
1.select框中的数据从数据库获取:
- s2=fields.ChoiceField(
- initial=2,
- choices=models.animal.objects.all().values_list("id","name"),
- )
上面的这个列子有个问题,当我们更新数据库后,页面上不会更新数据,这是因为获取数据库数据的字段是静态的,在程序加载的时候执行,执行一次后就固定了,所以当数据库有更新过后,是不能刷新的
解决方式:
让类在每次创建对象时候执行数据库操作:
- class customForm(forms.Form):
- s2=fields.ChoiceField(
- initial=2,
- choices=[],
- )
- def __init__(self,*args,**kwargs):
- super(customForm,self).__init__(*args,**kwargs)
- self.fields["s2"].widget.choices=models.animal.objects.all().values_list("id","name")
Form对象在创建的时候就可以传给他一个字典,他会将字典的值显示到对应的标签中去
- obj = customForm({"s2":[1,2],"phone":"123123"})
数据来自:http://www.cnblogs.com/wupeiqi/articles/6144178.html,自己练习整理了下,感谢大神
Django_Form验证(三)字段,字段的参数,widgets种类的更多相关文章
- Django中ORM常用字段类型及参数
常用字段: <1> CharField 字符串字段, 用于较短的字符串. CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的 ...
- Django(七)模型:字段属性、字段选项(参数)
一.模型类属性命名限制 参考:https://docs.djangoproject.com/zh-hans/3.0/topics/db/models/ 1)不能是python的保留关键字. 2)不允许 ...
- [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?
情况描述:在MySQL的user表中,对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引? 根据查询字段的位置不同来决定,如查询a, a,b a,b, ...
- 【java/oralce/sql】往一张仅有id,名称,创建时间三个字段的表中插入百万数据需要多久?1分26秒
代码下载:https://files.cnblogs.com/files/xiandedanteng/fastfilltable20191222.rar 表testtb18的结构如下: CREATE ...
- 现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为buyer_favorite1。 buyer_favorite1包含:买家id,商品id,收藏日期这三个字段,数据以“\t”分割
实验内容(mapReduce安装请按照林子雨教程http://dblab.xmu.edu.cn/blog/631-2/) 现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为 ...
- 【Django 字段和相关参数补充】
字段类型: 1.models.AutoField 自增列=int(11) 如果没有的话,默认会生成一个名称为id的列,如果要显示的自定义一个自增列,必须将给列设置为主键primary _key=Tru ...
- 一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现。
一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现.
- Django模型类之models字段类型和参数以及元数据meta
models之字段类型和参数 示例: # class Test(models.Model): # courses_test # """测试学习用""& ...
随机推荐
- 使用selenium爬取网站动态数据
处理页面动态加载的爬取 selenium selenium是python的一个第三方库,可以实现让浏览器完成自动化的操作,比如说点击按钮拖动滚轮等 环境搭建: 安装:pip install selen ...
- C++中的指针,指针函数和函数指针
指针是C或C++中的一大难题,因此弄懂指针对C和C++的学习有很大的帮助,最近一直在研究指针,因此写一篇随笔把心得记录一下. 简单来说指针也是一种变量,只不过指针变量所存储的不是我们直观上看到的,而是 ...
- Linux下查看CPU型号,内存大小,硬盘空间的命令(详解)
1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | wc -l 2 **uniq命令:删除重 ...
- Ubuntu16.04安装YouCompleteMe
1.要求vim的版本在7.4.143以上,支持python2/3,通过vim --version查看. 2.下载源码: https://github.com/Valloric/YouComplete ...
- 第二个web网页
1.源代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8">-------- ...
- py-day3-5 python 函数式编程
# 函数式(方程式 y = 2*x+1) def calc(x): return 2*x+1 print('得出的结果:',calc(6)) 得出的结果: 13 # 面向过程 def calc(x): ...
- sql server 2016 附加 其它目录的数据库
如果数据库不在默认目录,那么需要将 mdf所在目录或者 mdf文件 添加 用户 [NT SERVICE\MSSQLSERVER]的创建权限,否则会提示没有权限, 具体详见: https://docs. ...
- docker stats top diff和cp
实战[root@localhost ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1fb916fb0e13 ...
- CVE-2017-16995 漏洞利用
Ubuntu本地提权(CVE-2017-16995)漏洞复现 在 ichunqiu 看到的环境(https://www.ichunqiu.com/course/61487),觉得有意思就记录一下. 实 ...
- mysql中间件kingshard
这样写是OK的: select * from bind_history limit 10;select id, passport_id, person_id, create_time, cast(is ...