Django之Form验证clean方法

form验证预留了3个可自定制数据验证的三个方法

self._clean_字段名()      #针对单个字段预留的方法(也就是该字段通过form验证以后就会触发该对应名字的自定义方法)
self._clean_form()       #针对多个字段预留的方法
self._post_clean()       #针对多个字段预留的方法

  

为什么要预留呢?因为数据格式的验证通过以后,不代表数据存入数据库正常,如果存入数据库出现问题,我们就需要使用到预留的方法,因为如果在is_valid判断True以后,你进行数据存储出现问题,那么错误信息我们就不可以封装到form自身生成的错误结构里面。简单理解就是中间件。  

 

整个流程

验证流程:
        1.调用了is_valid方法 
        2.执行了self.fuu_clean()
        3.执行了self_clean_fields(开始字段匹配验证)
        4.执行源码的 self._clean_form()#执行该的方法(我们可以自定义)(支持异常,直接返回异常)
        5.执行源码的 self._post_clean()#执行该的方法(我们可以自定义)(不允许直接返回异常,需要调用add_error方法把异常作为实参进行有效返回)
        6.is_valid进行赋值:只有2个一个是true代表数据正确,一个是false:代表数据错误
        7.url对应函数里面进行判断id_valid
        8.正确通过obj.clean进行获取 错误的话通过obj.errors获取

代码

from django import forms 
from django.forms import fields
from django.forms import widgets
 
class UserForm(forms.Form):
    username = fields.CharField(label='用户名')
    email = fields.EmailField(label='邮箱')
 
    ###每个字段数据格式通过验证都会触发下面的对应的字段名字自定方法
    # def clean_username(self):
    #     value=self.cleaned_data['username']
    #     #if models.UserAuth.object.filter(username = value)
    #     if value == 'root':
    #         return value
    #     else:
    #         from django.core.exceptions import ValidationError
    #         raise ValidationError('该用户不正确')
 
    ###所有的字段格式通过验证都会触发下面的clean方法和_post_clean的方法
    def clean(self):
        v1 = self.cleaned_data['username']
        v2 = self.cleaned_data['email']
        if v1 == "root" and v2 =="root@live.com":
            pass
        else:
            from django.core.exceptions import ValidationError
            raise ValidationError('用户名或邮箱错误')
        return self.cleaned_data
 
    # def _post_clean(self):
    #     v1 = self.cleaned_data['username']
    #     v2 = self.cleaned_data['email']
    #     if v1 == "root" and v2 =="root@live.com":
    #         pass
    #     else:
    #         from django.core.exceptions import ValidationError
    #         self.add_error("__all__",ValidationError('用户名或邮箱错误'))
    #                          第一个实参必须为: "__all__" 或者 None

  

 

 

只要记住上面3个方法判断以后:

1.单个字段方法如 def cleand_字段名():进行判断以后如果正确直接pass或者返回字段的value,错误进行raise,当然可以修改用户提交的数据进行返回,然后回归正常流程进行is_valid判断,true我们可以通过obj.clean() or obj.cleaned_data提取数据,错误就obj.errors提取

2.全部字段方法如 def cleand():进行判断以后如果正确直接pass或者返回本身的self.cleaned_data,错误进行raise,当然可以修改用户提交的数据进行返回。然后回归正常流程进行is_valid判断,true我们可以通过obj.clean() or obj.cleaned_data提取数据,错误就obj.errors提取

3.全部字段方法如 def _post_cleand():进行判断以后如果正确直接pass或者返回self.cleaned_data,错误进行self.add_error,当然可以修改用户提交的数据进行返回。然后回归正常流程进行is_valid判断,true我们可以通过obj.clean() or obj.cleaned_data提取数据,错误就obj.errors提取

 

 

posted @ 2020-05-31 12:27  JIMfan  阅读(695)  评论(0编辑  收藏  举报