<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">
<tr><td><span style="font-size: 16px;">一、简介</td>
</tr></table>
web框架中避免不了对表单的验证,我们可以通过js在表单数据提交前做一次校验,然而在Django中form组件不仅仅提供验证功能,还可以生成HTML,还可以与model结合使用,等等强大的功能。
先了解下主要的作用:
2.views函数处理
3.HTML模板
<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">
<tr><td><span style="font-size: 16px;">三、form类中的字段和插件介绍</td>
</tr></table>
创建Form类时,主要涉及到字段(fields)和插件(widgets),字段用于对用户请求数据的验证,插件用于自动生成HTML。
1、Django内置字段
CharField(Field)
max_length
min_length=<span style="color: #000000;">None,最小长度
strip=<span style="color: #000000;">True 是否移除用户输入空白
IntegerField(Field)
max_value
min_value=<span style="color: #000000;">None,最小值
FloatField(IntegerField)
...
DecimalField(IntegerField)
max_value
max_digits=<span style="color: #000000;">None,总长度
decimal_places=<span style="color: #000000;">None,小数位长度
BaseTemporalField(Field)
input_formats
DateField(BaseTemporalField) 格式:
2015-09-01<span style="color: #000000;">TimeField(BaseTemporalField) 格式:11:12<span style="color: #000000;">
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12<span style="color: #000000;">
DurationField(Field) 时间间隔:
%d %H:%M:%S.%<span style="color: #000000;">f...
RegexField(CharField)
regex,自定制正则表达式
max_length
error_message=None,忽略,错误信息使用 error_messages={<span style="color: #800000;">'<span style="color: #800000;">invalid<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">...<span style="color: #800000;">'<span style="color: #000000;">}
EmailField(CharField)
...
FileField(Field)
allow_empty_file=<span style="color: #000000;">False 是否允许空文件,文件也在clean_data里
ImageField(FileField)
...
注:需要PIL模块,pip3 install Pillow
以上两个字典使用时,需要注意两点:
- form表单中 enctype=<span style="color: #800000;">"<span style="color: #800000;">multipart/form-data<span style="color: #800000;">"
- view函数中 obj =<span style="color: #000000;"> MyForm(request.POST,request.FILES)
URLField(Field)
...
BooleanField(Field)
...
NullBooleanField(BooleanField)
...
ChoiceField(Field)
...
choices=(),选项,如:choices = ((0,<span style="color: #800000;">'<span style="color: #800000;">上海<span style="color: #800000;">'),(1,<span style="color: #800000;">'<span style="color: #800000;">北京<span style="color: #800000;">'<span style="color: #000000;">),)
required=<span style="color: #000000;">True,是否必填
widget=<span style="color: #000000;">None,插件,默认select插件
label=<span style="color: #000000;">None,Label内容
initial=<span style="color: #000000;">None,初始值
help_text=<span style="color: #800000;">''<span style="color: #000000;">,帮助提示
ModelChoiceField(ChoiceField)
... django.forms.models.ModelChoiceField
queryset,<span style="color: #008000;">#<span style="color: #008000;"> 查询数据库中的数据
empty_label=<span style="color: #800000;">"<span style="color: #800000;">---------<span style="color: #800000;">",<span style="color: #008000;">#<span style="color: #008000;"> 默认空显示内容
to_field_name=None,<span style="color: #008000;">#<span style="color: #008000;"> HTML中value的值对应的字段
limit_choices_to=None <span style="color: #008000;">#<span style="color: #008000;"> ModelForm中对queryset二次筛选
<span style="color: #000000;">
ModelMultipleChoiceField(ModelChoiceField) <span style="color: #008000;">#多选
... django.forms.models.ModelMultipleChoiceField
TypedChoiceField(ChoiceField)
coerce = <span style="color: #0000ff;">lambda<span style="color: #000000;"> val: val 对选中的值进行一次转换
empty_value= <span style="color: #800000;">''<span style="color: #000000;"> 空值的默认值
MultipleChoiceField(ChoiceField)
...
TypedMultipleChoiceField(MultipleChoiceField)
coerce = <span style="color: #0000ff;">lambda<span style="color: #000000;"> val: val 对选中的每一个值进行一次转换
empty_value= <span style="color: #800000;">''<span style="color: #000000;"> 空值的默认值
ComboField(Field)
fields=<span style="color: #000000;">() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式
fields.ComboField(fields=[fields.CharField(max_length=20<span style="color: #000000;">),fields.EmailField(),])
MultiValueField(Field)
PS: 抽象类,只能被继承,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
SplitDateTimeField(MultiValueField)
input_date_formats=None,格式列表:[<span style="color: #800000;">'<span style="color: #800000;">%Y--%m--%d<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">%m%d/%Y<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">%m/%d/%y<span style="color: #800000;">'<span style="color: #000000;">]
input_time_formats=None 格式列表:[<span style="color: #800000;">'<span style="color: #800000;">%H:%M:%S<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">%H:%M:%S.%f<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">%H:%M<span style="color: #800000;">'<span style="color: #000000;">]
FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中
path,文件夹路径
match=<span style="color: #000000;">None,正则匹配
recursive=<span style="color: #000000;">False,递归下面的文件夹
allow_files=<span style="color: #000000;">True,允许文件
allow_folders=<span style="color: #000000;">False,允许文件夹
required=<span style="color: #000000;">True,widget=<span style="color: #000000;">None,label=<span style="color: #000000;">None,initial=<span style="color: #000000;">None,help_text=<span style="color: #800000;">''<span style="color: #000000;">
GenericIPAddressField
protocol=<span style="color: #800000;">'<span style="color: #800000;">both<span style="color: #800000;">'<span style="color: #000000;">,both,ipv4,ipv6支持的IP格式
unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1<span style="color: #000000;">, PS:protocol必须为both才能启用
SlugField(CharField) 数字,字母,下划线,减号(连字符)
...
UUIDField(CharField) uuid类型
...
注:UUID是根据MAC以及当前时间等创建的不重复的随机字符串
2、Django内置插件
3、常用插件示例
<span style="color: #008000;">#
<span style="color: #008000;"> 单radio,值为字符串<span style="color: #008000;"> <span style="color: #008000;"> user = fields.ChoiceField(<span style="color: #008000;"> <span style="color: #008000;"> choices=((1,),<span style="color: #008000;"> <span style="color: #008000;"> initial=2,<span style="color: #008000;"><span style="color: #008000;"> widget=widgets.RadioSelect<span style="color: #008000;">
<span style="color: #008000;"> )
<span style="color: #008000;">#<span style="color: #008000;"> 单select,值为字符串<span style="color: #008000;">
<span style="color: #008000;"> user = fields.CharField(<span style="color: #008000;">
<span style="color: #008000;"> initial=2,<span style="color: #008000;">
<span style="color: #008000;"> widget=widgets.Select(choices=((1,))<span style="color: #008000;">
<span style="color: #008000;"> )
<span style="color: #008000;">#<span style="color: #008000;"> 单select,值为字符串<span style="color: #008000;">
<span style="color: #008000;"> user = fields.ChoiceField(<span style="color: #008000;">
<span style="color: #008000;"> choices=((1,<span style="color: #008000;">
<span style="color: #008000;"> widget=widgets.Select<span style="color: #008000;">
<span style="color: #008000;"> )
<span style="color: #008000;">#<span style="color: #008000;"> 多选select,值为列表<span style="color: #008000;">
<span style="color: #008000;"> user = fields.MultipleChoiceField(<span style="color: #008000;">
<span style="color: #008000;"> choices=((1,<span style="color: #008000;">
<span style="color: #008000;"> initial=[1,],<span style="color: #008000;">
<span style="color: #008000;"> widget=widgets.SelectMultiple<span style="color: #008000;">
<span style="color: #008000;"> )
<span style="color: #008000;">#<span style="color: #008000;"> 单checkBox<span style="color: #008000;">
<span style="color: #008000;"> user = fields.CharField(<span style="color: #008000;">
<span style="color: #008000;"> widget=widgets.CheckBoxInput()<span style="color: #008000;">
<span style="color: #008000;"> )
<span style="color: #008000;">#<span style="color: #008000;"> 多选checkBox,值为列表<span style="color: #008000;">
<span style="color: #008000;"> user = fields.MultipleChoiceField(<span style="color: #008000;">
<span style="color: #008000;"> initial=[2,<span style="color: #008000;">
<span style="color: #008000;"> choices=((1,<span style="color: #008000;">
<span style="color: #008000;"> widget=widgets.CheckBoxSelectMultiple<span style="color: #008000;">
<span style="color: #008000;"> )
<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">
<tr><td><span style="font-size: 16px;">四、初始化数据</td>
</tr></table>
很多时候,我们在一个页面上做增删改查的时候,需要从数据库中将数据拿出来并在页面渲染,那么这些默认值可以使用form直接生成在页面上
方法一:定义form字段中使用数据库中选项变化时候,该默认值不会改变)
1.form类定义
2、views函数处理
3、html模版
方法二:重写form构造方法,在实例化时候设置默认值(该方法是动态的),form定义如下:
<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">
<tr><td><span style="font-size: 16px;">五、form操作动态select标签</td>
</tr></table>
场景:当我们在数据库中增加一条数据时候,使用form生成的html标签中的select表现需要是最新数据,所以我们需要在渲染模板之前再次从数据库中获取最新数据。
方式一:form实例化之后,通过修改生成的form对象中封装的choices字段重新赋值,确保是当前最新数据,示例:
form定义