表单_验证器

本文详细介绍了Django中表单验证的使用,包括内置验证器、自定义验证器以及如何验证单个和多个字段。强调了自定义验证器的创建和在验证过程中的注意事项,并探讨了如何提取和处理错误信息。此外,还讨论了表单的分类管理,以提高代码组织性。
摘要由CSDN通过智能技术生成

常用验证器

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映射

⑷编辑模板

⑸访问

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值