zoukankan      html  css  js  c++  java
  • Django之forms组件

    1.forms组件的基本使用

    # 1.forms组件的基本使用 
        写一个基础的forms.Form的类
        1、from app01 import views
           form_obj = views.LoginForm({'username':'koko','password':'123','email':12312})
          
           
           
        2.基本使用
            1.将需要验证的数据 以字典的方式传递给自定的类 实列化参数对象
            
            form_obj = views.LoginForm({'username':'koko','password':'123','email':12312})
            2.如何验证数据是否全部合法
            form_obj.is_valid()    # is_valid()是所有的字段必须都合法 才会显示为True
           
            3. form_obj.errors  # 查看错误原因 会一一匹配我们字典的vlue 和我们类中设置的限制条件做匹配 
            {'password': ['Ensure this value has at least 5 characters (it has 3).'],
            'confirm_pwd': ['This field is required.'], 
            'email': ['Enter a valid email address.']}
            
            4.显示正确字段
            
            form_obj = views.LoginForm({'username':'koko','password':'123456','confirm_pwd':'123456','email':'12312@qq.com'})
            form_obj.is_valid()  # True 必须全部符合条件才会为真
                
            
            5.注意:
                1.自定义中所有的字段默认必须都是必须要传值的 一个都不能少
                {'confirm_pwd': ['This field is required.'], 'email': ['Enter a valid email address.']}
                2.form_obj.errors  #  如果所有字段都是合法的 错误的字段返回是一个空字典{}
                3.如果我们传入类中没有的字段则不会产生任何变化 
                form_obj.cleaned_data只会逐一对比我们类中有的字段
                {'username': 'koko', 'password': '123456', 'confirm_pwd': '123456', 'email': '12312@qq.com'}

     

     原理就是form_obj.error 会将我们实列化的字典的值 和我们字段一个个比对 逐一判断里面的属性 及限制条件  将不符合的字段存放到我们的errors {字典中} 将合法的字段的值存放 清洗后满足条件存放到cleaned_data 中 is_vail() 是个(布尔值)是检验所有的字典中的值符合条件才是True

    2.forms组件前端渲染的三种方法

    {#第一种#}
    {#第一种#}
    {# {{ form_obj.as_p }}#}
    {#制动渲染封装性太高了 拓展性差#}
    {#都可以帮我们自动渲染输入框#}
    {# {{ form_obj.as_table}}#}
    {#第二种#}
    {#第二种#}
    {#可拓展性高但是书写太麻烦了#}
    {#form_obj.username 是一个框对象 form_obj.username.label 会将当前的类作为框的前显示的值#}
    {#{{ form_obj.username.label }}{{ form_obj.username }}#}
    {#{{ form_obj.password.label }}{{ form_obj.password }}#}
    {#{{ form_obj.email.label }}{{ form_obj.email }}#}
    {#第三种推荐使用 form_obj 是一个类的空对象 没有进行传值#}
    {#第三种 form_obj 是一个类的空对象 没有进行传值#}
    {#拓展行高 书写方便 foo 就是框对象 foo.label 会将当前类的字段首字母大写作为框的头名#}
    {#如何修改为汉字的呢 字段的属性设置#}
    {% for foo in form_obj %}
        <p>{{ foo.label }}{{ foo }}</p>
    {% endfor %}

    注意事项
      1.forms组件在帮你渲染页面的时候 只会渲染获取用户输入的标签 提交按钮需要你手动添加

      2.input框的label注释 不指定的情况下 默认用的类中字段的首字母大写

    2.forms检的登陆实例

      前后端都要进行验证

      前端也可以进行数据以及输入的数据是否合法 ,但是很容易通过爬虫进行修改 所以后端必须做检验  

      

     如何取消前端认证呢:

    <form action="" method="post" novalidate>  # 可以取消前端的认证
    {% for foo in form_obj %}
    <p>{{ foo.label }}{{ foo }}</p>
    {% endfor %}

    <input type="submit" value="提交 " >
    </form>

     前端models 代码  验证用户输入的位数和我们mdels 属性 提示展示信息

    from django.shortcuts import render,HttpResponse,redirect
    from django import forms
    # Create your views here.
    
    # 1.forms组件基本使用
    
    
    class LoginForm(forms.Form):
        username = forms.CharField(max_length=8, min_length=3,label='用户名',
         error_messages={'max_length':'用户名最大8位',
                         'min_length': '用户最少3位',
                         'required':'用户名不能为空'}
        )
    
        password = forms.CharField(max_length=8, min_length=5,label='密码',
                                   error_messages={'max_length':'密码最大8位',
                                                   'min_length': '密码最少5位',
                                                   'required': '密码不能为空'
                                                   }
                                   )
    
        confirm_pwd = forms.CharField(max_length=8, min_length=5,label='再次检验密码',
                                      error_messages={
    
                                          'max_length': '用户名最大8位',
                                          'min_length': '密码最少5位',
                                          'required': '密码不能为空'})
        email = forms.EmailField(label='邮箱',
                                 error_messages={
    
                                     'required': '密码不能为空',
                                    'invalid':'邮箱格式不正确'})

    后端逻辑代码

    def login(request):
        # 传值前端渲染方式
        # 1.用类是实例化一个空对像
        form_obj = LoginForm()
        # 2.将空对象传给前端页面
        # if request.method == 'POST':
        #     username = request.POST.get('username')
        #     password = request.POST.get('password')
        #     confirm_pwd = request.POST.get('confirm_pwd ')
        #     email = request.POST.get('email')
        #3 .接受全段传过来的数据
        if request.method == 'POST':
            # 先通过类实例化
            print(request.POST)
            form_obj = LoginForm(request.POST)
            # 4.验证数据 让forms组件帮我们去校验
            if form_obj.is_valid():
                pass
                # 5.如过全部验证合法则写入数据库
            # else: #6. 反之不通过 像前端展示错误信息
    
        return render(request,'login.html',locals())

    前端显示代码

    <form action="" method="post" novalidate>
    {% for foo in form_obj %}
        <p>{{ foo.label }}{{ foo }}</p>
    {#    #foo.errors.0拿到对象的{} 报错信息 errors.0 是去除li 只要文本的内容#}
            <p style="color: red" >{{ foo.errors.0 }}</p>
    {% endfor %}
    
        <input type="submit" value="提交 " >
    </form>
    </body>
    </html>

    报错信息的展示

    {#    #foo.errors.0拿到对象的{} 报错信息 errors.0 是去除li 只要文本的内容#}
    <p style="color: red" >{{ foo.errors.0 }}</p>


    4.钩子函数

      已登录为实例 

      1.局部钩子 (验证客户是否密码一致)

      # 钩子函数是在我们类下面的属于类方法
        def clean_username(self):  # 验证用户名中是否有不合法的敏感词汇
            # 获取从前端输入的名字 然后后端接受 所有的符合类里面的数据会缓存到cleaned_data {[],[]} 中
            username = self.cleaned_data.get('username')
            if '666' in username:
                self.add_error('username','不能有666这么捞的字眼')
            return username

      2.全局钩子(所以字段)

     后端代码

     # 全局钩子(针对多个字段做额外的校验)
        def clean(self):
            # 前端输入的数据
            password = self.cleaned_data.get('password')
            confirm_pwd = self.cleaned_data.get('confirm_pwd')
            if not password == confirm_pwd:
                self.add_error('confirm_pwd','两次密码不一致')
            return self.cleaned_data

    前端展示全局钩子的校验 证人密码的密码属性我没有加主要为了验证

    5.froms 组件的其他字段操作

      1.核心必会字段

        required 是否必填默认True  可以改为False 

        label  显示注释信息  显示框外的头名 

        error_messages= {'key':'value'}  报错信息

        initial 初始化默认值

        widget 控制标签属性和样式 

        widgte = widgets.PasswordIput()  隐藏密码 

        

        控制标签属性
        widget=widgets.PasswordInput(attrs={'class':'form-control c1 c2','username':'jason'})

        其他字段了解知识点(知道有这些对象 需要用到的时候 能够知道去哪找)

      2.了解字段

      

                其他字段了解知识点(知道有这些对象 需要用到的时候 能够知道去哪找)
                    # 单选的radio框
                    gender = forms.ChoiceField(
                        choices=((1, ""), (2, ""), (3, "保密")),
                        label="性别",
                        initial=3,
                        widget=forms.widgets.RadioSelect()
                    )
                    # 单选select
                    hobby = forms.ChoiceField(
                        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
                        label="爱好",
                        initial=3,
                        widget=forms.widgets.Select()
                    )
                    # 多选的select框
                    hobby1 = forms.MultipleChoiceField(
                        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
                        label="爱好",
                        initial=[1, 3],
                        widget=forms.widgets.SelectMultiple()
                    )
                    # 单选的checkbox
                    keep = forms.ChoiceField(
                        label="是否记住密码",
                        initial="checked",
                        widget=forms.widgets.CheckboxInput()
                    )
                    # 多选的checkbox
                    hobby2 = forms.MultipleChoiceField(
                        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
                        label="爱好",
                        initial=[1, 3],
                        widget=forms.widgets.CheckboxSelectMultiple()
                    )
                    
  • 相关阅读:
    hdu acm 2844 Coins 解题报告
    hdu 1963 Investment 解题报告
    codeforces 454B. Little Pony and Sort by Shift 解题报告
    广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
    hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    hdu acm 1114 Piggy-Bank 解题报告
    poj 2531 Network Saboteur 解题报告
    数据库范式
    ngnix 配置CI框架 与 CI的简单使用
    Vundle的安装
  • 原文地址:https://www.cnblogs.com/mofujin/p/11580103.html
Copyright © 2011-2022 走看看