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

 

posted @ 2020-12-19 14:31  渔歌晚唱  阅读(140)  评论(0)    收藏  举报