Django之Form验证clean方法(验证篇六)

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/Burgess_zheng/article/details/86657454

上一篇:Django之Form验证select的choice选项数据从数据库实时调用(验证篇五)点击跳转
下一篇:django之modelform验证实战示例演示(验证篇七)点击跳转

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

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

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

整个流程理一理:(主要是clean的原理(自定义数据验证))

     验证流程:
        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 =="[email protected]":
            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 =="[email protected]":
    #         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提取

上一篇:Django之Form验证select的choice选项数据从数据库实时调用(验证篇五)点击跳转
下一篇:django之modelform验证实战示例演示(验证篇七)点击跳转

猜你喜欢

转载自blog.csdn.net/Burgess_zheng/article/details/86657454
今日推荐