Django的Form(二)详解大数据

上一篇已经简单介绍了Django的Form,现在开始进阶操作了

。。。。。

创建Form类的时候,主要涉及到Form字段和Form的插件,字段用于做form验证,插件用来生成HTML

 

DjiangoForm的字段:

Field 
    required=True,               是否允许为空 
    widget=None,                 HTML插件 
    label=None,                  用于生成Label标签或显示内容 
    initial=None,                初始值 
    help_text='',                帮助信息(在标签旁边显示) 
    error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'} 
    show_hidden_initial=False,   是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直) 
    validators=[],               自定义验证规则 
    localize=False,              是否支持本地化 
    disabled=False,              是否可以编辑 
    label_suffix=None            Label内容后缀 
  
  
CharField(Field) 
    max_length=None,             最大长度 
    min_length=None,             最小长度 
    strip=True                   是否移除用户输入空白 
  
IntegerField(Field) 
    max_value=None,              最大值 
    min_value=None,              最小值 
  
FloatField(IntegerField) 
    ... 
  
DecimalField(IntegerField) 
    max_value=None,              最大值 
    min_value=None,              最小值 
    max_digits=None,             总长度 
    decimal_places=None,         小数位长度 
  
BaseTemporalField(Field) 
    input_formats=None          时间格式化    
  
DateField(BaseTemporalField)    格式:2015-09-01 
TimeField(BaseTemporalField)    格式:11:12 
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12 
  
DurationField(Field)            时间间隔:%d %H:%M:%S.%f 
    ... 
  
RegexField(CharField) 
    regex,                      自定制正则表达式 
    max_length=None,            最大长度 
    min_length=None,            最小长度 
    error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'} 
  
EmailField(CharField)       
    ... 
  
FileField(Field) 
    allow_empty_file=False     是否允许空文件 
  
ImageField(FileField)       
    ... 
    注:需要PIL模块,pip3 install Pillow 
    以上两个字典使用时,需要注意两点: 
        - form表单中 enctype="multipart/form-data" 
        - view函数中 obj = MyForm(request.POST, request.FILES) 
  
URLField(Field) 
    ... 
  
  
BooleanField(Field)   
    ... 
  
NullBooleanField(BooleanField) 
    ... 
  
ChoiceField(Field) 
    ... 
    choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),) 
    required=True,             是否必填 
    widget=None,               插件,默认select插件 
    label=None,                Label内容 
    initial=None,              初始值 
    help_text='',              帮助提示 
  
  
ModelChoiceField(ChoiceField) 
    ...                        django.forms.models.ModelChoiceField 
    queryset,                  # 查询数据库中的数据 
    empty_label="---------",   # 默认空显示内容 
    to_field_name=None,        # HTML中value的值对应的字段 
    limit_choices_to=None      # ModelForm中对queryset二次筛选 
      
ModelMultipleChoiceField(ModelChoiceField) 
    ...                        django.forms.models.ModelMultipleChoiceField 
  
  
      
TypedChoiceField(ChoiceField) 
    coerce = lambda val: val   对选中的值进行一次转换 
    empty_value= ''            空值的默认值 
  
MultipleChoiceField(ChoiceField) 
    ... 
  
TypedMultipleChoiceField(MultipleChoiceField) 
    coerce = lambda val: val   对选中的每一个值进行一次转换 
    empty_value= ''            空值的默认值 
  
ComboField(Field) 
    fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式 
                               fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),]) 
  
MultiValueField(Field) 
    PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用 
  
SplitDateTimeField(MultiValueField) 
    input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y'] 
    input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] 
  
FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中 
    path,                      文件夹路径 
    match=None,                正则匹配 
    recursive=False,           递归下面的文件夹 
    allow_files=True,          允许文件 
    allow_folders=False,       允许文件夹 
    required=True, 
    widget=None, 
    label=None, 
    initial=None, 
    help_text='' 
  
GenericIPAddressField 
    protocol='both',           both,ipv4,ipv6支持的IP格式 
    unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用 
  
SlugField(CharField)           数字,字母,下划线,减号(连字符) 
    ... 
  
UUIDField(CharField)           uuid类型 
    ...

注:UUID是根据MAC以及当前时间等创建的不重复的随机字符串

  查看源码可以发现Field字段是所有字段的基类;其他的一切都是通过它来衍生出来的。

Django的Form插件

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

在写Form字段的时候可以设置 widget参数来修改Form字段的默认插件

form中的radio,checkbox和select的生成

# 单radio,值为字符串 
# user = fields.CharField( 
#     initial=2, 
#     widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),)) 
# ) 
  
# 单radio,值为字符串 
# user = fields.ChoiceField( 
#     choices=((1, '上海'), (2, '北京'),), 
#     initial=2, 
#     widget=widgets.RadioSelect 
# ) 
  
# 单select,值为字符串 
# user = fields.CharField( 
#     initial=2, 
#     widget=widgets.Select(choices=((1,'上海'),(2,'北京'),)) 
# ) 
  
# 单select,值为字符串 
# user = fields.ChoiceField( 
#     choices=((1, '上海'), (2, '北京'),), 
#     initial=2, 
#     widget=widgets.Select 
# ) 
  
# 多选select,值为列表 
# user = fields.MultipleChoiceField( 
#     choices=((1,'上海'),(2,'北京'),), 
#     initial=[1,], 
#     widget=widgets.SelectMultiple 
# ) 
  
  
# 单checkbox 
# user = fields.CharField( 
#     widget=widgets.CheckboxInput() 
# ) 
  
  
# 多选checkbox,值为列表 
# user = fields.MultipleChoiceField( 
#     initial=[2, ], 
#     choices=((1, '上海'), (2, '北京'),), 
#     widget=widgets.CheckboxSelectMultiple

在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,解决办法有两种。

方式一:

自定义构造方法

from django.forms import Form 
from django.forms import widgets 
from django.forms import fields 
from django.core.validators import RegexValidator
from app import models
class MyForm(Form): user = fields.ChoiceField( # choices=((1, '上海'), (2, '北京'),), initial=2, widget=widgets.Select ) def __init__(self, *args, **kwargs): super(MyForm,self).__init__(*args, **kwargs) # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),) # self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')

方式二:

利用ModelChoiceField和ModelMultipleChoiceField字段来实现

from django import forms 
from django.forms import fields 
from django.forms import widgets 
from django.forms import models as form_model 
from django.core.exceptions import ValidationError 
from django.core.validators import RegexValidator 
  
class FInfo(forms.Form): 
    authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all()) 
    # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/9250.html

(0)
上一篇 2021年7月19日 09:19
下一篇 2021年7月19日 09:19

相关推荐

发表回复

登录后才能评论