Form介绍
我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。
Django form组件就实现了上面所述的功能。
总结一下,其实form组件的主要功能如下:
- 生成页面可用的HTML标签
- 对用户提交的数据进行校验
- 保留上次输入内容
1,普通方式手写注册功能
views.py
=
request.method == = request.POST.get(= request.POST.get(
len(username) < 6
error_msg =
HttpResponse( render(request,,{: error_msg})
login.html
注册页面
{{ error_msg }}
2,使用form组件实现注册功能
views.py
先定义好一个RegFoem类:
django <span style="color: #008000;">#<span style="color: #008000;"> 按照Django form组件的要求自己写一个类
<span style="color: #0000ff;">class<span style="color: #000000;"> RegForm(forms.Form):
name = forms.CharField(label=<span style="color: #800000;">"<span style="color: #800000;">用户名<span style="color: #800000;">"<span style="color: #000000;">)
pwd = forms.CharField(label=<span style="color: #800000;">"<span style="color: #800000;">密码<span style="color: #800000;">")
再写一个视图函数:
= request.method ==
form_obj =
HttpResponse( render(request,,{: form_obj})
login2.html
注册2
{{ form_obj.name.label }}
{{ form_obj.pwd.label }}
看网页效果发现 也验证了form的功能:• 前端页面是form类的对象生成的 -->生成HTML标签功能• 当用户名和密码输入为空或输错之后 页面都会提示 -->用户提交校验功能• 当用户输错之后 再次输入 上次的内容还保留在input框 -->保留上次输入内容
Form那些事
1,常用字段与插件
创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;
initial
初始值,input框里面的初始值。
==8==
= forms.CharField(min_length=6,label=)
error_messages
重写错误信息。
==8==: : : = forms.CharField(min_length=6,label=)
password
==6==forms.widgets.PasswordInput(attrs={: },render_value=
radioSelect
单radio值为字符串
==8==((1,),(2,),(3,==3=
单选Select
==((1,),),==
多选Select
==((1,initial=[1,3=
单选checkbox
====
多选checkbox
==((1,widget=
关于choice的注意事项:
在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。
方式一:
django.forms django.forms django.forms <span style="color: #0000ff;">class<span style="color: #000000;"> MyForm(Form):
user </span>=<span style="color: #000000;"> fields.ChoiceField(
</span><span style="color: #008000;">#</span><span style="color: #008000;"> choices=((1,'上海'),'北京'),</span>
initial=2<span style="color: #000000;">,widget</span>=<span style="color: #000000;">widgets.Select
)
</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__init__</span>(self,*args,**<span style="color: #000000;">kwargs):
super(MyForm,self).</span><span style="color: #800080;">__init__</span>(*args,**<span style="color: #000000;">kwargs)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> self.fields['user'].choices = ((1,)</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 或</span>
self.fields[<span style="color: #800000;">'</span><span style="color: #800000;">user</span><span style="color: #800000;">'</span>].choices = models.Classes.objects.all().values_list(<span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">caption</span><span style="color: #800000;">'</span>)</pre>
方式二:
django django.forms django.forms <span style="color: #0000ff;">class<span style="color: #000000;"> FInfo(forms.Form):
authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all()) <span style="color: #008000;">#<span style="color: #008000;"> 多选
<span style="color: #008000;">#<span style="color: #008000;"> authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all()) # 单选
2,Django Form所有内置字段
======None,错误信息 {: ,: ====CharField(Field)
max_length=<span style="color: #000000;">None,最大长度
min_length=<span style="color: #000000;">None,最小长度
strip=<span style="color: #000000;">True 是否移除用户输入空白
IntegerField(Field)
max_value
=<span style="color: #000000;">None,最大值
min_value=<span style="color: #000000;">None,最小值
FloatField(IntegerField)
...
DecimalField(IntegerField)
max_value
=<span style="color: #000000;">None,最小值
max_digits=<span style="color: #000000;">None,总长度
decimal_places=<span style="color: #000000;">None,小数位长度
BaseTemporalField(Field)
input_formats
=<span style="color: #000000;">None 时间格式化
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
=<span style="color: #000000;">None,最小长度
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 是否允许空文件
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,帮助提示
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)
... 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类型
django.forms django.forms django.forms django.core.exceptions <span style="color: #008000;">#<span style="color: #008000;"> 自定义验证规则
<span style="color: #0000ff;">def<span style="color: #000000;"> mobile_validate(value):
mobile_re = re.compile(r<span style="color: #800000;">'<span style="color: #800000;">^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">if <span style="color: #0000ff;">not<span style="color: #000000;"> mobile_re.match(value):
<span style="color: #0000ff;">raise ValidationError(<span style="color: #800000;">'<span style="color: #800000;">手机号码格式错误<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">class<span style="color: #000000;"> PublishForm(Form):
title </span>= fields.CharField(max_length=20<span style="color: #000000;">,min_length</span>=5<span style="color: #000000;">,error_messages</span>={<span style="color: #800000;">'</span><span style="color: #800000;">required</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">标题不能为空</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">min_length</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">标题最少为5个字符</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">max_length</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">标题最多为20个字符</span><span style="color: #800000;">'</span><span style="color: #000000;">},widget</span>=widgets.TextInput(attrs={<span style="color: #800000;">'</span><span style="color: #800000;">class</span><span style="color: #800000;">'</span>: <span style="color: #800000;">"</span><span style="color: #800000;">form-control</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">placeholder</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">标题5-20个字符</span><span style="color: #800000;">'</span><span style="color: #000000;">}))
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 使用自定义验证规则</span>
phone = fields.CharField(validators=<span style="color: #000000;">[mobile_validate,],error_messages</span>={<span style="color: #800000;">'</span><span style="color: #800000;">required</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">手机不能为空</span><span style="color: #800000;">'</span><span style="color: #000000;">},</span><span style="color: #800000;">'</span><span style="color: #800000;">placeholder</span><span style="color: #800000;">'</span>: u<span style="color: #800000;">'</span><span style="color: #800000;">手机号码</span><span style="color: #800000;">'</span><span style="color: #000000;">}))
email </span>= fields.EmailField(required=<span style="color: #000000;">False,error_messages</span>={<span style="color: #800000;">'</span><span style="color: #800000;">required</span><span style="color: #800000;">'</span>: u<span style="color: #800000;">'</span><span style="color: #800000;">邮箱不能为空</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">invalid</span><span style="color: #800000;">'</span>: u<span style="color: #800000;">'</span><span style="color: #800000;">邮箱格式错误</span><span style="color: #800000;">'</span><span style="color: #000000;">},widget</span>=widgets.TextInput(attrs={<span style="color: #800000;">'</span><span style="color: #800000;">class</span><span style="color: #800000;">'</span>: <span style="color: #800000;">"</span><span style="color: #800000;">form-control</span><span style="color: #800000;">"</span>,<span style="color: #800000;">'</span><span style="color: #800000;">placeholder</span><span style="color: #800000;">'</span>: u<span style="color: #800000;">'</span><span style="color: #800000;">邮箱</span><span style="color: #800000;">'</span>}))</pre>