• 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()
                    )
                    
  • 相关阅读:
    map
    构造函数和对象
    for...in...and for each...in...
    事件
    JSON
    css伪类
    正则表达式
    什么是DOM、什么是BOM
    CSS颜色
    grid-layout实验
  • 原文地址:https://www.cnblogs.com/mofujin/p/11580103.html
Copyright © 2020-2023  润新知