Django表单和域的验证

详情可见Django的官方文档。
当数据被清理之后会进行表单验证。我们去理解表单验证这个东西主要是为了能够自己定制一个表单验证功能,所以我们需要清楚整个过程。找到我们可以插足的地方。
在表单处理的时候,有三种类型的清理方法会被执行。具体到某个函数就是当你调用is_valid()会触发某三种类型的清理方法。当然也有其他可以出发清理和验证的方法(访问errors属性或者直接调用full_clean()方法),但是这些不是我们想要的。
总的来说,如果数据有问题,任何的清理方法都能抛出一个ValidationError的异常。然后把相关的错误传递给ValidationError的构造函数。如果数据一切正常那么就返回这个被清理的对应的Python对象数据。当然如果你检测到了多个错误,那么可以将这些错误作为一个list传递构造函数。
大部分的验证可以使用validators完成,validator是一个可以轻松被重用的帮助函数。validators在to_python和validate方法之后运行。
为了方便下面的描述,需要先介绍一下validators这个东西
(验证器)validators
Django表单中的域支持一些简单的通用的函数和类叫做验证器。可以通过域的validators参数被传递给域的构造函数,或者通过在定制自己的域类,比如说class MyCharField(CharField),然后在这个类中定义default_validators这个属性。

一个表单的验证主要可以分成以下几个步骤,这些步骤可以被订制。

  • to_python()方法
  • validate()方法
  • run_validators()方法
  • clean()方法
  • clean_<fieldname>()方法
  • 表单子类的clean()方法

to_python()方法
to_python()方法是所有验证的第一步,他试图强制让数据变成合理的python对象,如果不行的话就抛出一个ValidationError的异常。比如说一个本来应该输入整数的,你输入了一个无法转成整数的字符串的话就会导致抛出一个ValidationError。
validate()方法
某一个域上的上的验证如果不适合交给validator的话就可以交给validate(),也就是说一些不适合交给validator的验证逻辑可以交给validate()方法处理
run_validators()方法
这个方法将所有的域都验证一次,然后将错误像大杂烩一样合起来放在ValidationError中
clean_<fieldname>()方法
一个表单的子类中定义一个方法,方法的名字写成clean_<fieldname>(),fieldname替换成你想要clean的域的名字,比如说表单有个域叫name,那么你在表单的子类中定义一个方法名字叫clean_name()。
表单子类的clean方法
如果你需要同一时间访问多个域的话,那么你可以使用clean方法进行验证。着这里产生的错误都会被放在表单的一个专门的域叫做__all__里面。
举个简单的例子,现在一个表单class ContactForm(forms.Form),其中某两个域有依赖关系,比如说CC_myself这个域不为空的时候,subject域必须包含“help”这个字符串,那么你就可以选择在clean中进行相关验证,如果有验证错误的话就抛出异常,这个错误会保存在__all__这个域中。

个人关于表单验证这个东西总结如下:

  1. 由于从表单得到的数据类型具有局限性,通常字符串和整型居多,如果你想要得到自己的一些容器类型,比如说列表,字典,集合等等。这些可以在to_python中进行验证。
  2. 大部分情况下,如果想对从表单得到的某一个域里面的数据的内容进行验证的话,通常可以使用验证器,这种东西使用起来比较简单。定义一个可调用的验证器Python对象就可以了,然后作为参数传给域。个人觉得这个方法应该用的比较多,因为通常情况下出入的字符串居多,所以在这里可以使用正则表达式的方式去验证。
  3. 个人觉得针对某个域设计一个clean_<field_name>这个东西应该比较少用,可以用上面的代替,当然我没用django开发过东西,只是第一感觉,轻拍。
  4. 最后clean()方法应该用的比较多,为什么我觉得上面那个会用的比较少呢,还有一个原因就是上面的功能可以被clean()所替代。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值