########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__')中可以取到 好了今天到此结束了!!!!!!!!!