django-form组件

########django-form组件########

什么时form组件呢?
    其实就是一个form类,可以检测前端传来的数据,是否合法。
    就好邮件格式对不对,用户名中不能以什么开头,等等之类

form组件的几大用处:
一、校验字段功能
    1、首先先到导入forms这个模块
    from django import forms
    2、自己写一个类,并且继承forms.Form
    class Myform(forms.Form):
        # 这行代码的意思,name这字段最长位8,最短位3
        name = forms.CharField(max_length=8,min_length=3)

    def index(request):
        dic = {'name':'zh'}
        # 这里就是类的实例化,传的参数必须为一个字典
        myform = Myform(dic)
        # 这是对象的绑定方法,它的返回值就是一个布尔类型
        # True表示你传的dic这个字典满足form里的条件,False就是不满足
        # 我们可以通过判断它,再进行逻辑操作,比如该字段符合你的要求,再怎么操作
        if myform.is_valid():
            return HttpResponse('校验成功')
        # 走到这一步,代表当中有字段不符合要求
        # 它的返回值是一个对象,但是它继承了字典,所以你可以通过get取到错误提示
        # 对了,你传的字典的key值必须要和创建的类(Myform)要对应,并且只能多,不能少
        # name_error = myform.errors.get('name')
        # 这样你可以取到name字段出错的原因了
        name_error = myform.errors
        return HttpResponse('校验失败')

    ## 总结下:1、Myform的实例化必须传字典
              2、is_valid()返回值是布尔类型
              3、errors  调用这个方法,返回值是对象,你可以通过get取值

2、渲染标签功能
form组件可以在视图函数中使用,也可以在模板中使用
视图层:
    def index(request):
        myform = Myform()
        return render(request,'index.html',local())
模板层:
    渲染方式一:
    <form action='' method='post'>
        用户名:{{myform:name}} <br>
        <input type='submit' value = '提交'></input>
    </form>
    # 这里的{{myform:name}} 和你写input框是一样的效果,就是属性比input框多一点

    渲染方式二(推荐使用):
    <form action='' method='post'>
        {% for foo in myform%}
            {{ foo.lable }} : {{ foo }}  <br>
        <input type='submit' value = '提交'></input>
    </form>
    # 页面显示都是一样的,foo.lable不是用户名,是name,但是你可以在创建Myform类时
    # 在CharFiel中添加lable='用户名',这样就行了。

    渲染方式三:
        <form action='' method='post'>
            {{ myform.as_p }}
        <input type='submit' value = '提交'></input>
    </form>
    # 对,方式三就是这么简单,但是拓展性太差了,对不对,所以不推荐使用它


3、渲染错误信息功能
    渲染错误信息,之前不是写了error这个方法嘛,他就是装着错误信息的对象,
    其实就是让它渲染到页面上,这不就是很简单嘛
    拿渲染方式二来举例子吧:
    <form action='' method='post'>
        {% for foo in myform%}
            {{ foo.lable }} : {{ foo }} <span>{{foo.errors.0}}</span><br>
        <input type='submit' value = '提交'></input>
    </form>

    # 来讲下为什么不是用get去取错误信息,首先这个foo是什么?它就是你创建的字段
    # 所以直接通过索引取值就好了,那么就应该知道foo.errors貌似就是一个列表对吧
    # 模板渲染时我在后台渲染好了,再返回到前台的,那我可以不可以将错误信息传到前台
    # 让前台执行DOM操作进行渲染呢?
    # 我觉得太麻烦,况且前端我。。。(你懂的)

4、组件的参数配置
    其实在些Myform,下面的字段还有很多参数,我就写写大概有什么用
    max_length    # 代表该字段最长为多少
    min_length    # 代表该字段最短为多少
    error_messages # 这是设置错误信息的属性
    # 例子
    error_messages=
    {'max_length': '最长八位', 'min_length': '最短三位', 'required': '不能为空'}
    required   # 默认值为True,意思是你传来的字段必须有它,没有的话校验失败
    widget=widgets.TextInput()  # 你在模板渲染的时候,就会渲染成Input框,type为text
                                  还有其他类型的input框,自己在看看吧
    对了,在TextInput(),你可以为input添加属性,attrs={'class':'abc'}  写在括号里面
    lable   #这个是不是上面讲到了,lable='用户名'

5、局部钩子
    局部钩子说白了就是写一个函数,但是这个函数名必须为clean_name,这个name是可以改变的,
    你定义的类里,你想对哪个字段写钩子函数,这个name就为那个字段的名字,比如我想为password这个
    字段写钩子函数,那函数名就为clean_password,就这样。

    那这个局部钩子有什么用了?
        首先你的程序能走到局部钩子这一步,就说明你传的字典中的字段符合要求,这要记清楚,那么我们在
        取值就从clean_data中取就好了,clean_data里装的是符合要求的数据,是一个字典。
        我们可以从clean_data中取到相应的值再做一次逻辑处理,比如我写clean_name这个局部钩子,
        我可以拿到name,对这个name进行一些操作,名字开头不能是数字,名字中不能有有什么字符,这
        些等等,看你自己的需求,逻辑代码写好了,最后return name 就好了
        
6、全局钩子
    全局钩子其实作用差不多的,每个字段你可以进行局部钩子进行逻辑书写,这些处理完成之后,有需要的话,
    你再进行全局处理,举个例子就大概能明白,你在写注册用户的时候,是不是有密码,确认密码,你可以进行
    布局钩子处理,处理完毕是不是在进行判断,判断他们是否相等,相等的话,就存到数据库中,不相等就抛个
    异常,对了对了,上面局部钩子忘记写异常,下面讲讲。
    

补充:1、局部钩子,全局钩子所抛出异常的类型为ValidationError,它是在下面这行代码导入
        from django.core.exceptions import ValidationError
     2、局部钩子抛出的异常会添加到该字段中的错误信息中,也就是myform.errors.get(字段名)中
     3、而全局钩子抛出的异常会添加到__all__中,myform.errors.get('__all__')中可以取到
     

好了今天到此结束了!!!!!!!!!
原文地址:https://www.cnblogs.com/zhuchunyu/p/9998297.html