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,"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,自己练习整理了下,感谢大神

posted @ 2017-12-23 22:55  SSSupreme  阅读(216)  评论(0编辑  收藏  举报