前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
与模型关联的表单验证
表单的验证在我们调用is_valid
函数时执行,也可以通过访问errors
属性或调用full_clean
函数
验证的出错会引发ValidationError
异常,该异常会向表单传达一个错误信息
验证的步骤主要分为两步,表单验证,如果关联了模型,则还会进行模型验证
-
表单字段的验证分为以下过程
-
字段
to_python
,这个方法将字段的值根据字段的类型转换为Python中的数据类型,如果不能转换则引发ValidationError
异常 -
字段的
clean
函数,该函数用来运行对应的验证器,根据顺序执行to_python
,validate
特异性验证,以及run_validators
(用于将错误信息汇总)验证,如果有任何验证过程引发了ValidationError
异常,验证都将停止。其余通过验证的字段数据插入到表单的cleaned_data字典中 -
表单中的字段
clean
函数,这个验证用于完成特定属性,与表单字段类型无关;比如我们经常需要验证用户输入的字段值不能为小红,那么可以编写字段的clean
函数,函数命名为clean_<fields_name>
,fileds_name
为字段名class TestTableForm(forms.ModelForm): def clean_name(self): name = self.cleaned_data.get('name') if name == '小红': raise forms.ValidationError('不允许小红') return name
-
表单的
clean
函数,这个方法进行表单中多个字段值的联合验证,验证之后的数据返回为cleaned_data
,可以通过重写该函数来提供的额外验证方法,并且为了维持clean
方法的验证行为,在代码中,表单类需要调用父类的clean
方法def clean(self): cleaned_data = super(TestTableForm,self).clean() name = cleaned_data.get('name') if '1' in name: cleaned_data['name'] = name.replace('1','一') return cleaned_data
-
总结的来说:一个表单在验证时,首先验证每一个字段,接着调用字段的clean_fields
函数,最后使用表单类的clean
函数进行验证。如果表单与模型关联,那么现在还有第二步验证,模型的验证
-
模型的验证为如下过程
-
验证关联模型的字段及相关属性:
Model.clean_fields(exclud=None)
,该方法将验证模型的所有字段属性,如果有字段验证错误,引发ValidationError
异常 -
验证模型的完整性:
Model.clean(exclude=None)
,可以对模型做整体的检验,如果想要自己验证模型中通过属性校验的数据,可以在模型类中重新定义这个函数from django.core.exceptions import ValidationError class TestTable(models.Model): name = models.CharField(max_length=10,verbose_name='名字',unique=True) def clean(self): if '$' in self.name: raise ValidationError('无法使用$符号')
-
验证模型的唯一性:
Model.validate_unique(exclude=None)
,如果模型中所有唯一约束性,比如使用类似unique
属性,会校验表单中的值是否唯一
-
并且,除了通过绑定模型的表单实例
is_valid
函数可以来进行以上的验证过程,如果想自己控制验证可以直接使用模型的
full_clean(exclude=None,validate_unique=True)
方法进行以上三个步骤的验证
与模型关联的表单保存
与模型关联的表单,在校验成功之后,表单实例可以直接通过save
函数来进行表单数据的保存数据库
def form_test(request):
if request.method == "POST":
form = TestTableForm(request.POST,request.FILES)
if form.is_valid():
form.save()
return HttpResponse('OK:%s' % value)
该函数也支持在模型类中进行重写,但是要切记使用父类的save方法,确保数据可以正确存储到数据库中
def save(self, *args, **kwargs):
if self.name == 'abc':
return False#不做存储
else:
super(TestTable,self).save(*args, **kwargs)