BLOG
Enjoy when you can, and endure when you must.
MAR 09, 2013/Django
Django Form 验证过程

最近在Django的Form上使用很频繁,于是花了些时间对其更深入的了解了下,以下和大家分享一下Form表单的验证过程。

Django的表单验证过程分为很多步:

1. 各Field数据类型验证与转换:

表单验证的第一步则是从widget中获取原始数据,并根据Field所接受的数据类型进行转换,如果在此过程中发生错误,会抛出ValidationError异常。

2. 各Field的内置clean()方法验证:

这一步会根据先前的验证结果返回数据,如果验证通过则返回clean data,如果失败则抛出异常。

3. clean_<fieldname>()方法:

这一步是用户自定义的验证步骤,用以对所需的特定数据进行验证而与数据类型和field无关。

4. Form的clean()方法:

这是最后一步,也可由用户自定义所需的验证。这一步中的验证主要针对多个field的同时验证,以满足不同field之间的关联性。如果在这里验证通过,则返回cleaned_data字典。

前三步的验证都与相应的Field有关,当任意一个Field未通过验证,都会抛出对应Field的ValidationError异常。但最后一步例外,它是一个综合性的验证,故与Field无关,在这里抛出的异常都会放到一个名为“__all__”的特殊“Field”里。如果在这里抛出的异常需针对某一个Field,则需要用到Form的_errors属性,下面是Django官方文档里的一个例子:

    # Everything as before.
    ...
   
    def clean(self):
        cleaned_data = super(ContactForm, self).clean()
        cc_myself = cleaned_data.get("cc_myself")
        subject = cleaned_data.get("subject")
   
        if cc_myself and subject and "help" not in subject:
            # We know these are not in self._errors now (see discussion
            # below).
            msg = u"Must put 'help' in subject when cc'ing yourself."
            self._errors["cc_myself"] = self.error_class([msg])
            self._errors["subject"] = self.error_class([msg])
   
            # These fields are no longer valid. Remove them from the
            # cleaned data.
            del cleaned_data["cc_myself"]
            del cleaned_data["subject"]
   
        # Always return the full collection of cleaned data.
        return cleaned_data

参考文档:

Form and field validation

COMMENTS
23/11From 123123

成都市

LEAVE COMMNT