python学习:Django的Form组件(9)
Django的Form组件
使用Django的Form组件,对用户输入数据进行验证,生成HTML代码。
使用Form组件步骤:
1、创建一个Verifi验证类,继承froms.Form;
2、类中,根据表单栏位name属性定义每个提交信息验证条件
3、创建类的实例化对象,将request.POST或request.GET请求数据传入;
4、根据name属性对应验证,返回cleaned_data或者errors。
Form组件还可以生成HTML代码:
创建一个空的Verifi类对象verifi,然后将他返回给html,html通过{{verify.属性名}},会自动创建出对应输入框。
示例:
创建form.html,一个表单提交信息
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django的Form组件</title>
</head>
<body>
<h1>form表单</h1>
<form action="/url_dispatch/form/" method='post'>
<!--用户名长度6-18-->
<input type="text" name="user"></br>
<!--默认使用循环拿到错误,一个列表-->
<!--获取第一个错误-->
<!--<p>{{verifi.errors.user.0}}</p>-->
<p>{{verifi.errors.user}}</p>
<!--密码长度6-12-->
<input type="password" name="pwd"></br>
<p>{{verifi.errors.pwd}}</p>
<!--邮箱-->
<input type="email" name="mail"></br>
<p>{{verifi.errors.mail}}</p>
<!--数字-->
<input type="number" name="age"></br>
<p>{{verifi.errors.age}}</p>
<input type="submit" value="提交">
{% csrf_token %}
</form>
</body>
</html>
修改urls.py,加入url路径
path("form/",views.form)
修改views.py,创建视图函数
#使用form组件表单验证
#使用步骤:
#1创建一个类,继承forms.Form
#2定义校验规则
from django import forms
class Verifi(forms.Form):
#定义最大长度,最小长度,required非空
#设置自定义信息,error_message
user = forms.fields.CharField(max_length=18,
min_length=6,
required=True,
error_messages={"required":"必须输入值","max_length":"长度必须小于18位","min_length":"长度大于6位"})
pwd = forms.fields.CharField(max_length=12,min_length=6,required=True)
#验证邮箱
mail = forms.fields.EmailField()
#格式错误设置message为invalid
age = forms.fields.IntegerField(error_messages={"invalid":"必须为数字"})
def form(request):
if request.method == "GET":
return render(request,"form.html")
else:
# #获取数据
# user = request.POST.get("user")
# pwd = request.POST.get("pwd")
# mail = request.POST.get("mail")
# age = request.POST.get("age")
# print("用户信息:",user,pwd,mail,age)
#使用Form验证
verifi = Verifi(request.POST);
if verifi.is_valid():
#已经验证成功数据
print(verifi.cleaned_data)
else:
#失败信息
print(verifi.errors)
return render(request,"form.html",locals())
使用form自动创建HTML:
修改form.html
<!--使用Django,自动生产HTML-->
<form action="/url_dispatch/form/" method='post'>
<!--用户名长度6-18-->
<p>{{verifi.user}}{{verifi.errors.user}}</p>
<!--密码长度6-12-->
<p>{{verifi.pwd}}{{verifi.errors.pwd}}</p>
<!--邮箱-->
<p>{{verifi.mail}}{{verifi.errors.mail}}</p>
<!--数字-->
<p>{{verifi.age}}{{verifi.errors.age}}</p>
<input type="submit" value="提交">
{% csrf_token %}
</form>
修改GET提交时候将verifi对象传到html:
if request.method == "GET":
verifi = Verifi()
return render(request,"form.html",{"verifi":verifi})
我们第一次执行时就会发现已经自动创建了相应输入框的HTML代码,验证结果获取后,表单里的值能够回显。
Form组件字段详解:
1、字符串字段:forms.fields.CharField()
2、整数字段:forms.fields.IntergerField()
整数字段有额外限制条件:max_value:最大值,min_value:最小值;
3、邮件字段:forms.fields.EmailField()
4、浮点字段:forms.fields.FloatField()
浮点字段额外限制条件:max_value:最大值,min_value:最小值;max_digits:总位数长度;decimal_places:小数位长度;
5、正则表达式字段:forms.fields.Regex()
限制条件:regex:正则表达式,
6、时间字段:forms.fields.DateField(),forms.fields.DateTimeField(),
7、文件字段:forms.fields.FileField(),打开文件
8、图片字段:forms.fields.ImageField()
字段限制条件:
1、required :是否必输
2、max_length:最大长度
3、min_length:最小长度
4、error_message:错误信息,{required:”message”,max_length:”message”,invalid:“类型是否合法”}
5、widget:HTML插件,默认None,可以定制生成HTML插件
6、label:设置label,使用:对象.字段.label获取到label
7、initial:设置字段初始值
8、help_text:帮助信息;
9、show_hidden_initial:当前字段输入框下,创建一个隐藏的输入框。True或者False;
10、validators:自定义验证规则,列表传入;
11、localize:是否支持本地化,True或者False;
12、disabled:是否可输入
示例1:
Form的各种验证字段类型
#form字段
class Verifi1(forms.Form):
#限制条件
#字符串字段
user = forms.fields.CharField(required=True);
#整数字段
age = forms.fields.IntegerField(max_value=10,min_value=2);
#邮件字段
mail = forms.fields.EmailField();
#浮点字段
float_fields = forms.fields.FloatField(max_value=10,min_value=2)
#正则表达式字段
regex = forms.fields.RegexField(regex="\d");
#时间日期
dates = forms.fields.DateField();
datetime = forms.fields.DateTimeField();
times = forms.fields.TimeField();
#文件字段
#allow_empty_file:是否允许空文件
files = forms.fields.FileField(allow_empty_file=False)
#图片字段
img = forms.fields.ImageField()
#布尔字段,true or false
boolean = forms.fields.BooleanField()
#true or flase or null
boolean = forms.fields.NullBooleanField()
#选择字段,下拉选择框
#choices:传入元组list
#initial:2 ,设置默认值
choice = forms.fields.ChoiceField(choices=[(1,"tang",),(2,"lu",)],initial=2)
#多选的下拉选择框
#initial:设置默认值,传入列表多值
mul_choice = forms.fields.MultipleChoiceField(choices=[(1,"ke"),(2,"in")],initial=[1,2])
#ip验证
#protocol:验证ipv4,ipv6,both两个都可以验证
ip_veri = forms.fields.GenericIPAddressField(protocol="both")
#组合多个验证fields
combo_filed = forms.fields.ComboField(fields=[forms.fields.EmailField,forms.fields.CharField(max_length=10)])
示例2:
自定义插件的属性,一些常用的input框类型,单选,多选和下拉选择框。
#自定义插件属性
class Verifi2(forms.Form):
#widget自定义HTMl插件
#使用attrs自定义属性
#<Textarea name = "tang" >
name = forms.fields.CharField(widget=forms.widgets.Textarea(attrs={"name":"tang"}))
#下拉选择框(单选)
city = forms.fields.CharField(widget=forms.widgets.Select(choices=[(1,"成都"),(2,"重庆")]),initial=2)
city = forms.fields.IntegerField(widget=forms.widgets.Select(choices=[(1,"成都"),(2,"重庆")]),initial=2)
city = forms.fields.ChoiceField(choices=[(1,"成都"),(2,"重庆")])
#下拉选择框(多选)
city = forms.fields.MultipleChoiceField(choices=[(1,"重庆"),(2,"成都")],initial=[1,2]);
city = forms.fields.MultipleChoiceField(widget=forms.widgets.SelectMultiple,choices=[(1,"重庆"),(2,"成都")])
#多选框
hobby = forms.fields.CharField(widget=forms.widgets.CheckboxInput(),label="篮球")
bobby = forms.fields.MultipleChoiceField(widget=forms.widgets.CheckboxSelectMultiple,choices=((1,"篮球"),(2,"跑步")),initial=[1,2])
#单选按钮
radio = forms.fields.ChoiceField(widget=forms.widgets.RadioSelect,choices=[(1,"man"),(2,"woman")],initial=1)
示例3:
实现Form字段数据的动态刷新
#动态绑定数据
#数据库添加数据,不重启服务器情况下,获取更新数据
class Verifi3(forms.Form):
#这是类的静态属性,当类加载时就加载入内存,不重启服务器,不会改变
city = forms.fields.ChoiceField(choices=[(1,"成都"),(2,"重庆")])
#定义__init__方法,当每次新建类对象时调用
def __init__(self,*args,**kwargs):
super(Verifi3,self).__init__(self,*args,**kwargs);
#给choices赋予新值,从数据库中查出models.City.objects.value_list("id","name");
self.fields["city"].widget.choices = [(1,"成都"),(2,"重庆"),(3,"北京")]
#使用方式2,不推荐
#这种需要models的__str__方法返回要显示栏位,不然下拉只会显示Object
city = forms.models.ModelChoiceField(
queryset="queryset对象,数据库查询",
#option的value值对应栏位
to_field_name="id"
)
示例4:
通过Django的Form验证源代码查看,找到Form提供的可以自定制验证的接口,编写相应验证代码实现功能。

执行verifi.is_valid()返回True or False,执行这个方法先执行full_clean()方法。

查看full_clean()中执行了self._clean_fields(),self._clean_form(),self._post_clean()方法。

其中self_clean_fields()循环form表单栏位值

我们可以写对应clean_属性名()方法,对对应的属性添加额外验证。
示例:
修改Verifi类,添加clean_user()方法,添加额外验证。
from django import forms
from django.core.exceptions import ValidationError
class Verifi(forms.Form):
#定义最大长度,最小长度,required非空
#设置自定义信息,error_message
user = forms.fields.CharField(max_length=18,
min_length=4,
required=True,
error_messages={"required":"必须输入值","max_length":"长度必须小于18位","min_length":"长度大于6位"})
pwd = forms.fields.CharField(max_length=12,min_length=4,required=True)
#验证邮箱
mail = forms.fields.EmailField()
#格式错误设置message为invalid
age = forms.fields.IntegerField(error_messages={"invalid":"必须为数字"})
#编写对应属性的clean_属性名方法,添加额外验证
def clean_user(self):
val = self.cleaned_data["user"]
#这里可以使用val去数据库取数据验证,
if val == "root":
#返回错误信息
raise ValidationError("root已经存在")
#这里验证成功,返回cleaned_data
return self.cleaned_data["user"]
修改form.html,另外一种form表单写法,也可以使用原有写法:
<!--使用Django,定制验证
{{verifi.as_p}}这种方式建立form,浏览器会自动加上约束
-->
<form action="/url_dispatch/form/" method='post'>
{{ verifi.as_p }}
<input type="submit" value="提交">
{% csrf_token %}
</form>
继续查看源码,执行完_clean_fields(),然后执行_clean_form(),这个函数中执行了类的self.clean()方法。我们就可以在子类重写self.clean()方法,添加一个验证全部属性的逻辑。

这里什么也没有做,直接返回cleaned_data,我们可以获取到所以数据,然后验证。

示例:
from django import forms
from django.core.exceptions import ValidationError
class Verifi(forms.Form):
#定义最大长度,最小长度,required非空
#设置自定义信息,error_message
user = forms.fields.CharField(max_length=18,
min_length=4,
required=True,
error_messages={"required":"必须输入值","max_length":"长度必须小于18位","min_length":"长度大于6位"})
pwd = forms.fields.CharField(max_length=12,min_length=4,required=True)
#验证邮箱
mail = forms.fields.EmailField()
#格式错误设置message为invalid
age = forms.fields.IntegerField(error_messages={"invalid":"必须为数字"})
#编写对应属性的clean_属性名方法,添加额外验证
def clean_user(self):
val = self.cleaned_data["user"]
#这里可以使用val去数据库取数据验证,
if val == "root":
#返回错误信息
raise ValidationError("root已经存在")
#这里验证成功,返回cleaned_data
return self.cleaned_data["user"]
#重写clean()方法,添加一个整体验证
def clean(self):
val_dict = self.cleaned_data;
v1 = val_dict["user"]
v2 = val_dict["pwd"]
#验证逻辑,可以联合几个属性验证
if v1 == "tang" and v2 =="1234":
raise ValidationError("密码过于简单")
return self.cleaned_data
本文来自博客园,作者:渔歌晚唱,转载请注明原文链接:https://www.cnblogs.com/tangToms/articles/14159009.html

浙公网安备 33010602011771号