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,"666"),("sb","It is me")] #这里写可迭代对象, 生成的select框中value就是1,2 )
多重验证,即一个字段可以验证多个内容:
multauth=fields.ComboField( fields=[fields.CharField(max_length=20), fields.EmailField(),] )
widgets:
字段分成这么多中类别,主要就是widgets参数默认值不一样,widgets可以让字段指定生成那种标签:
1 TextInput(Input) 2 NumberInput(TextInput) 3 EmailInput(TextInput) 4 URLInput(TextInput) 5 PasswordInput(TextInput) 6 HiddenInput(TextInput) 7 Textarea(Widget) 8 DateInput(DateTimeBaseInput) 9 DateTimeInput(DateTimeBaseInput) 10 TimeInput(DateTimeBaseInput) 11 CheckboxInput 12 Select 13 NullBooleanSelect 14 SelectMultiple 15 RadioSelect 16 CheckboxSelectMultiple 17 FileInput 18 ClearableFileInput 19 MultipleHiddenInput 20 SplitDateTimeWidget 21 SplitHiddenDateTimeWidget 22 SelectDateWidget
具体介绍几个简单列子:
1 # 单选框 2 s1=fields.CharField( 3 initial=2, 4 widget=widgets.Select(choices=[(1,"小兔"),(2,"小龙"),(3,"垃圾")]), 5 6 ) 7 s2=fields.ChoiceField( 8 initial=2, 9 choices=[(1,"小兔"),(2,"小龙"),(3,"垃圾")], 10 ) 11 # 多选框: 12 s3=fields.MultipleChoiceField( 13 initial=[1,2], 14 choices=[(1, "小兔"), (2, "小龙"), (3, "垃圾")], 15 )# 获取到数据是[1,2],是列表 16 s4=fields.CharField( 17 initial=[1,2], 18 widget=widgets.SelectMultiple(choices=[(1, "小兔"), (2, "小龙"), (3, "垃圾")]) 19 )#获取到的是一个'[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,自己练习整理了下,感谢大神