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

  • 相关阅读:
    实际运用中DataSet、DataTable、DataRow点滴
    SQL语句AND 和 OR执行的优先级
    CS程序,服务器端弹出MessageBox.Show()之类的UI操作???禁止
    使用动态SQL语句实现简单的行列转置(动态产生列)
    表的行列转置
    统计每种车型的数量
    由CAST()函数在.NET1.1和.NET4.0下处理机制不同所引发的BUG
    转载——网站重构的8点建议
    float,double和decimal类型
    优化DB2缓冲页的大小
  • 原文地址:https://www.cnblogs.com/guoguojj/p/8093412.html
Copyright © 2020-2023  润新知