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种类的更多相关文章

  1. Django中ORM常用字段类型及参数

    常用字段: <1> CharField 字符串字段, 用于较短的字符串. CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的 ...

  2. Django(七)模型:字段属性、字段选项(参数)

    一.模型类属性命名限制 参考:https://docs.djangoproject.com/zh-hans/3.0/topics/db/models/ 1)不能是python的保留关键字. 2)不允许 ...

  3. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?

    情况描述:在MySQL的user表中,对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引? 根据查询字段的位置不同来决定,如查询a,     a,b    a,b, ...

  5. 【java/oralce/sql】往一张仅有id,名称,创建时间三个字段的表中插入百万数据需要多久?1分26秒

    代码下载:https://files.cnblogs.com/files/xiandedanteng/fastfilltable20191222.rar 表testtb18的结构如下: CREATE ...

  6. 现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为buyer_favorite1。 buyer_favorite1包含:买家id,商品id,收藏日期这三个字段,数据以“\t”分割

    实验内容(mapReduce安装请按照林子雨教程http://dblab.xmu.edu.cn/blog/631-2/) 现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为 ...

  7. 【Django 字段和相关参数补充】

    字段类型: 1.models.AutoField 自增列=int(11) 如果没有的话,默认会生成一个名称为id的列,如果要显示的自定义一个自增列,必须将给列设置为主键primary _key=Tru ...

  8. 一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现。

    一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现.

  9. Django模型类之models字段类型和参数以及元数据meta

    models之字段类型和参数 示例: # class Test(models.Model): # courses_test # """测试学习用""& ...

随机推荐

  1. pytorch中,不同的kernel对不同的feature map进行卷积之后输出某一个channel对应的多个feature map如何得到一个channel的feature map

    实际上在卷积操作的时候,比如说,我某一层输出的feature map的size为4713*13 channel的数目为7,设经过某卷积层之后,网络输出的feature map的channel的数目为1 ...

  2. 安卓开发学习之AutoCompleteTextView

    最近在学习安卓开发,开始是看视频学的,基本上是照着老师的操作来,但其实老师也是按照安卓的开发文档来教的,于是决定试试自己看文档来学. 今天学到AutoCompleteTextView,一上来先按照Li ...

  3. AutoHotKey (AHK) 按键表+自定义快捷键简化操作的教程

    自定义快捷键简化操作的教程 ① 下载安装AutoHotKey,并用记事本新建一个MyHotKey.ahk文件,录入如②中信息 ② 下图可以实现,按F6即可触发“Ctrl+C”的复制快捷键,同理F7可实 ...

  4. leetcode 388.Lonest Absolute File Path

    要求寻找的是最长的长度的,那么考虑文件夹和文件的存在的不同形式的,利用当前所存在的层数和对应的长度之间做一个映射关系的并且用于计算总的长度关系的. class Solution { public: i ...

  5. Arch Linux root密码忘记了怎么办

    https://wiki.archlinux.org/index.php/Reset_root_password_(简体中文)https://wiki.archlinux.org/index.php/ ...

  6. centos安装jdk步骤

    1.官网或wget下载 jdk-8u172-linux-x64.tar.gz,解压到/usr/local/java目录: cd /home/tar wget xxxxxxx cp /home/tar/ ...

  7. 3.python中的基本概念

    注释: 单行注释 # 多行注释 """ ''' 变量: 把程序运行中产生的值,暂时存储在内存,方便后面的程序调用. 变量命名的规则: 1.用数字.字母.下划线组成. 2. ...

  8. 1T硬盘获3T体验 彻底解决NVR存储时间短的问题

    随着高清技术的进步,现在300W和400W的IPC越来越普及,但同时带来了更多的成本及存储便利问题.“硬盘存了7天就满了”.“同样大小的硬盘,存储时间越来越短”......为啥你的NVR不能存更长的时 ...

  9. ylbtech-协议-网络-安全协议:HTTPS

    ylbtech-协议-网络-安全协议:HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext ...

  10. iterator简单描述

    Item 26. Prefer iterator to const iterator, reverse_iterator, and const_reverse_iterator. 上面一段话,是< ...