常用验证器
1、在验证某个字段的时候,可以传递一个validators参数用来指定验证器,进一步对数据进行过滤
2、Django自带验证器有很多,但是很多验证器我们其实已经通过对应的Field或者一些参数就可以指定了
⑴比如EmailValidator,我们可以通过EmailField来指定
⑵比如MaxValueValidator,我们可以通过max_value参数来指定
3、以下是一些常用的验证器:
验证器名 | 描述 |
MaxValueValidator | 验证最大值 |
MinValueValidator | 验证最小值 |
MinLengthValidator | 验证最小长度 |
MaxLengthValidator | 验证最大长度 |
EmailValidator | 验证是否是邮箱格式 |
URLValidator | 验证是否是URL 格式 |
RegexValidator | 如果还需要更加复杂的验证,那么我们可以通过正则表达式的验证器RegexValidator |
例1:Filed源码
例2:使用验证器
⑴编辑表单
⑶编辑模板
⑷编辑视图
⑸访问_错误
⑹访问_正确
注:
1、从上面例子可以看到可以将Django内置的Filed和Validator组合使用:这样可以达到Filed默认之外的一些功能
2、不管这样做的意义不是很大,因为一般来说内置的Validator都有对应的Filed。因此,直接使用对应的Filed就可以达到目的了
⑴比如这个例子中通过CharField和EmailValidator组合使用来达到验证邮箱的效果,但是其实直接使用EmailFiled就可以直接达到效果了
⑵个人感觉,内置的RegexValidator验证器应该用处更大
3、主要的还是需要明白:File的验证功能主要是其验证器实现的
例3:验证手机号码
⑴编辑表单
自定义验证器
1、有时候对一个字段验证,不是一个长度,一个正则表达式能够写清楚的,还需要一些其他复杂的逻辑,那么我们可以对某个字段,进行自定义的验证
⑴比如在注册的表单验证中,我们想要验证手机号码是否已经被注册过了,那么这时候就需要在数据库中进行判断才知道
⑵Django中虽然自带了很多Filed和验证器,但是这些可能有时候并不能满足我们的需要,因此这时候就需要我们自己去定义专用的验证器了
2、对某个字段进行自定义的验证方式是:定义一个方法
⑴这个方法的名字定义规则是:clean_fieldname。如果验证失败,那么就抛出一个验证错误
验证单个字段
示例:注册
这是一个用户注册的例子:名字、电话、密码
⑴用户名字:没啥要求
⑵电话:用户注册时的电话不能是已经被注册了的,电话格式正确
⑶密码:密码长度不能小于6,且必须以字母大写开头
例4:
⑴编辑模型
⑵编辑表单
注:这里我们自定义了两个验证器
1、需要注意的是:在自定义的验证器验证通过后一定要return所验证的字段名,只有return返回后,在视图函数中才能通过"clean_data.get("字段名")"方法获取对应的值。如果没有return的话,那么在视图函数中就会获取不到
⑴其实就是:视图函数中需要通过"clean_data.get("字段名")"获取哪个字段,我们就返回哪个字段
2、前面例子中,没有自定义验证器时也没有编写return语句,Django会自动将所有字段全部return
⑶编辑模板
⑷编辑视图
⑸访问_正确
⑹访问错误
注:
1、表单校验功能:
⑴在前面的例子中说错了一个地方。就是,在前后端分离中,向前端全传递模板时,不需要传递表单,也是可以正常使用表单的验证功能的
⑵request.POST:前端通过POST方法传递过来的全部参数都是放在request.POST中的。这是一个类似于字典的数据类型
⑶form = RegisterForm(request.POST):表示将前端通过POST传递过来的全部参数,放到RegisterForm表单中进行校验,并将校验的结果赋值给你个变量form
⑷因此从这个过程中可以看出来:前端HTML是否是通过表单组件渲染的跟表单验证功能是完全没关系的,两个是相互独立的
2、在编写自定义验证器时,有几点需要注意:
⑴编写自定义表单的位置:与表单定义的字段处于同一个类,感觉可以把字段理解成类属性,验证器理解为类方法
⑵自定义验证器的方法名:必须是clean_字段名字
⑶验证器是针对一个字段的:只会验证方法名中的那个字段,有几个字段需要验证,那么就需要写多少个验证器方法
⑷验证通过时必须要return对应的数据:因为在视图函数中还需要通过cleaned_data.get()来获取数据
3、其实用Django的表单组件还是挺好的
⑴如果不使用表单组件的话,那么就需要在视图函数中进行表单验证,这样的话视图函数就会显得很臃肿
⑵而使用表单组件的话,就将表单验证的代码单独放在了一个PY文件中:视图函数只处理业务逻辑
验证多个字段
1、首先:这里说个验证多个字段不是说一个验证器方法对应多个字段。而是指多个字段间有一定联系,在验证时需要涉及到多个字段
⑴验证器是针对一个字段的:只会验证方法名中的那个字段
2、前面说的自定义表单验证器是针对一个字段的,那么如果需要验证多个字段时该怎么处理呢?
⑴解决办法:重写clean()方法
3、比如,在用户注册时需要"确认密码":输入的确认密码肯定是需要和第一次输入的密码是一样的
⑴这个时候就需要去验证第一次的密码和第二次的密码是否一致。这样在验证时就涉及到了两个字段
例5:
⑴编辑表单
⑵访问正确
⑶访问错误
提取错误信息
1、如果验证失败了,那么有一些错误信息是我们需要传给前端的。这时候我们可以通过以下属性来获取:
⑴form.errors:这个属性获取的错误信息是一个包含了html标签的错误信息
⑵form.errors.get_json_data():这个方法获取到的是一个字典类型的错误信息。将某个字段的名字作为key,错误信息作为值的一个字典
⑶form.as_json():这个方法是将form.get_json_data()返回的字典dump成json格式的字符串,方便进行传输
2、上述方法获取的字段的错误值,都是一个比较复杂的数据。比如以下:
⑴因此更多的时候需要我们将错误信息整理一下,再返回
{'username': [{'message': 'Enter a valid URL.', 'code': 'invalid'}, {'message': 'Ensurethis value has at most 4 characters (it has 22).', 'code': 'max_length'}]}
例6:
⑴编辑表单
⑵编辑视图
注:
1、这里专门定义了一个类来处理我们的错误信息
⑴这个错误类必须继承于forms.Form:只有这样才能调用其errors方法,来获取表单错误信息
⑵因为ErrorInfo类已经继承于Form类了,因此在编写表单类(RegisterForm)时,其就不需要再继承于Form类了,而只需要继承ErrorInfo类就可以了,其实也相当于间接集成至了Form类(多重继承)
⑶将错误信息单独定义成一个类,这样方便各个表单类的调用:其他表单来只要继承于这个类就好了
2、当然这里只是提供了一种自己整理错误信息的方法。至于怎么整理错误信息可能每个项目的处理方式都不一致。另外,整理错误信息的类(函数),也不一定要单独定义,反正处理方式肯定是有很多的
拓展
表单分类
1、前面在介绍表单时,我们是在应用程序APP下键了一个名为Form.py的文件:这样就需要将同一个APP下的所有表单类都放到一个PY文件中
2、这样感觉不是很友好,特别是表单多了后,找到一个表单类都需要点时间,对代码的管理也不是很好
3、因此,自己试了下将不同的表单放到不同的PY文件中,然后将不同的PY文件都放在一个目录下,结果项目运行是正常的
⑴个人感觉这样设计要好点,毕竟不同的表单类分开来管理要方便得多
例7:
⑴编辑表单
⑵编辑视图函数
⑶定义URL映射
⑷编辑模板
⑸访问