zoukankan      html  css  js  c++  java
  • Django Form表单控件

    form组件的校验说明

    先导包 from django import forms,创建一个类继承forms.Form,类里面的字段需要和POST上来的字段一一对应。

    class Userform(forms.Form):
        user = forms.CharField()
        pwd = forms.CharField(min_length=5)
        email = forms.EmailField()
        tel = forms.CharField()
    
    def form_test(request):
        if request.method=="POST":
            #Userform 里像xxx这些多余的字段不会管他,只会挨个按照字段对value进行校验,只要这些字段都通过认证,下面的form.is_valid 返回true,否则返回false
            form = Userform({"user":"alex","pwd":"123456","email":"aaa","xxx":"xxx"})
            print(form.is_valid())  #False
            #clean和cleaned_data会返回校验通过的字段
            print(form.clean(),type(form.clean()))  #{'user': 'alex'}
            print(form.cleaned_data,type(form.cleaned_data))  #{'user': 'alex'}
            # errors会返回校验未通过的字段,返回数据是字典{错误字段:[错误的返回值]},下面的打印字段是经过对这个字典转换成标签后的结果,所以我们可以对errors字段进行字典处理
            print(form.errors)
            # <ul class="errorlist"><li>pwd<ul class="errorlist"><li>Ensure this value has at least 5 characters (it has 3).</li></ul></li><li>email<ul class="errorlist"><li>Enter a valid email address.</li></ul></li><li>tel<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
            #这些错误的标签可以按照字段提取对应的标签,第0个元素则是标签内的文本
            print(form.errors.get("email"))  #<ul class="errorlist"><li>Enter a valid email address.</li></ul>
            print(form.errors.get("email")[0])  #Enter a valid email address.
        return render(request,"login.html")
    

    form组件的对POST请求的数据进行校验规则,字段需要和HTML标签字段相对应。

    上面的例子中我们 form = Userform({"user":"alex","pwd":"123456","email":"aaa","xxx":"xxx"}) 写死了,
    我们从request.POST数据获取的数据也是个字段<QueryDict: {'user': ['ZCB-CWQ'], 'pwd': ['123441'], 'email': ['sxfxtf@sina.com'], 'tel': ['123']}>,因此只要key值对应,就可以用form组件对里面的字段进行校验.

    利用form组件的实例对象,便捷的实现和前端字段进行对应,利用实例对象的字段进行循环渲染 方式1

    由于字段需要一一对应,那么通过生成form的实例对象字段的渲染可以减少代码,实现字段的对应 ,

    利用form实例对象的字段进行循环渲染 方式2

    这种方式主要是用for循环实例对象的字段进行渲染,但是input标签前面的text文本,需要先在类中每个字段定义label属性,然后在html中渲染实例字段的label值


    ------------恢复内容开始------------

    form组件的校验说明

    先导包 from django import forms,创建一个类继承forms.Form,类里面的字段需要和POST上来的字段一一对应。

    class Userform(forms.Form):
        user = forms.CharField()
        pwd = forms.CharField(min_length=5)
        email = forms.EmailField()
        tel = forms.CharField()
    
    def form_test(request):
        if request.method=="POST":
            #Userform 里像xxx这些多余的字段不会管他,只会挨个按照字段对value进行校验,只要这些字段都通过认证,下面的form.is_valid 返回true,否则返回false
            form = Userform({"user":"alex","pwd":"123456","email":"aaa","xxx":"xxx"})
            print(form.is_valid())  #False
            #clean和cleaned_data会返回校验通过的字段
            print(form.clean(),type(form.clean()))  #{'user': 'alex'}
            print(form.cleaned_data,type(form.cleaned_data))  #{'user': 'alex'}
            # errors会返回校验未通过的字段,返回数据是字典{错误字段:[错误的返回值]},下面的打印字段是经过对这个字典转换成标签后的结果,所以我们可以对errors字段进行字典处理
            print(form.errors)
            # <ul class="errorlist"><li>pwd<ul class="errorlist"><li>Ensure this value has at least 5 characters (it has 3).</li></ul></li><li>email<ul class="errorlist"><li>Enter a valid email address.</li></ul></li><li>tel<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
            #这些错误的标签可以按照字段提取对应的标签,第0个元素则是标签内的文本
            print(form.errors.get("email"))  #<ul class="errorlist"><li>Enter a valid email address.</li></ul>
            print(form.errors.get("email")[0])  #Enter a valid email address.
        return render(request,"login.html")
    

    form组件的对POST请求的数据进行校验规则,字段需要和HTML标签字段相对应。

    上面的例子中我们 form = Userform({"user":"alex","pwd":"123456","email":"aaa","xxx":"xxx"}) 写死了,
    我们从request.POST数据获取的数据也是个字段<QueryDict: {'user': ['ZCB-CWQ'], 'pwd': ['123441'], 'email': ['sxfxtf@sina.com'], 'tel': ['123']}>,因此只要key值对应,就可以用form组件对里面的字段进行校验.

    利用form组件的实例对象,便捷的实现和前端字段进行对应,利用实例对象的字段进行循环渲染 方式1

    由于字段需要一一对应,那么通过生成form的实例对象字段的渲染可以减少代码,实现字段的对应 ,

    利用form实例对象的字段进行循环渲染 方式2

    这种方式主要是用for循环实例对象的字段进行渲染,但是input标签前面的text文本,需要先在类中每个字段定义label属性,然后在html中渲染实例字段的label值

    利用form实例对象的字段进行循环渲染 方式3 这种更简单,渲染处只要一句话 {{ form_obj.as_p }},这个语法还支持as_table,as_ul

    就会把form标签按照这个固定格式用一个P标签包裹一个label和input标签循环输出, 优点是代码量少,缺点是无法定制化显示标签

    form组件的错误信息渲染和正确信息的保留

    前面的几种情况form表单可以对数据的正确与否做出判断,但是页面刷新后会消失.

    form组件的错误信息自定义

    上面错误的提示也是默认的英文,我们需要自定义错误的信息,更适合国人看

    from django.forms import widgets

    widget=widgets.TextInput() 设置input标签type=text
    widget=widgets.CheckboxInput() 设置input标签type=check
    widget=widgets.PasswordInput() 设置input标签type=Password
    等等很多

    自定义错误信息提示
    widget=widgets.TextInput(error_messages={"required":"required是为空的错误提示key","invalid":"这个是格式错误提示key"})

    自定义标签内的属性 比如class
    widget=widgets.TextInput(attrs={"class":"form-control"}) 设置input标签的class为form-control

    代码示例: form_pwd = forms.CharField(min_length=5,label="密码",widget=widgets.PasswordInput(attrs={"class":"form-control"}))

    form组件的局部钩子和全局钩子

    form组建的局部钩子都是从是它的is_valid()开始的.

    局部钩子和全局钩子使用区别

    局部钩子代码示例:

    全局钩子代码示例

    form组件的局部钩子和全局钩子注册页面案例

  • 相关阅读:
    [USACO 5.5]Hidden Password
    [Codeforces 1016F]Road Projects
    再会,OI
    [TJOI 2018]智力竞赛
    [POI 2009]Lyz
    [NOI 2015]品酒大会
    [NOI 2017]蔬菜
    [NOI 2017]整数
    [NOI 2017]游戏
    [NOI 2017]蚯蚓排队
  • 原文地址:https://www.cnblogs.com/Young-shi/p/15272332.html
Copyright © 2011-2022 走看看