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/9250.html

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

相关推荐

发表回复

登录后才能评论