Django表单类forms与模型关联以及表单验证

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

与模型关联的表单验证

表单的验证在我们调用is_valid函数时执行,也可以通过访问errors属性或调用full_clean函数

验证的出错会引发ValidationError异常,该异常会向表单传达一个错误信息

验证的步骤主要分为两步,表单验证,如果关联了模型,则还会进行模型验证

  • 表单字段的验证分为以下过程

    1. 字段to_python,这个方法将字段的值根据字段的类型转换为Python中的数据类型,如果不能转换则引发ValidationError异常

    2. 字段的clean函数,该函数用来运行对应的验证器,根据顺序执行to_pythonvalidate特异性验证,以及run_validators(用于将错误信息汇总)验证,如果有任何验证过程引发了ValidationError异常,验证都将停止。其余通过验证的字段数据插入到表单的cleaned_data字典中

    3. 表单中的字段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
      
    4. 表单的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函数进行验证。如果表单与模型关联,那么现在还有第二步验证,模型的验证

  • 模型的验证为如下过程

    1. 验证关联模型的字段及相关属性:Model.clean_fields(exclud=None),该方法将验证模型的所有字段属性,如果有字段验证错误,引发ValidationError异常

    2. 验证模型的完整性: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('无法使用$符号')
      
    3. 验证模型的唯一性: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) 

Guess you like

Origin blog.csdn.net/HeroicLee/article/details/121382778