django Model层常用验证器及自定义验证器

在Django中,对数据进行校验有两种方式:一种是通过Form校验,一种是通过Model校验。在此,我对Model中的校验方法做下记录。

 

示例之前补充以下几点:

 

1、Django数据校验方式分为以下三步:

  • Model.clean_fields()         验证字段基本规则比如长度格式等;
  • Model.clean()              可自定义验证条件和报错信息;
  • Model.validate_unique()       为验证添加的唯一性约束。

 

2、此三步验证通过调用full_claen(exclude=None, validate_unique=True)来依次执行。

       exclude:可以用来指定不需要执行校验的field。ModelForm也利用这个参数来将field排除。
       validate_unique:用来指定是否需要执行Model.validate_unique()

 

3、而full_clean()又是通过调用is_valid()方法来执行。

 

4、save()执行的时候是不会自动调用full_clean()来进行校验的。

校验应该在save()执行之前完成,你可以先在form进行校验,也可以在model中进行校验。但是,你必须确保通过这两个校验之后的数据是绝对没有问题的“干净”数据,然后再调用save()方法将数据存储入库。

 

5、校验中的错误处理

我们使用ValidationError来在Model.clean中抛出错误,这个错误信息将会存储在以NON_FIELD_ERRORS为key的字典中。这个key是用来存储对于整个model中的错误信息的。

如何获取校验的错误信息:

from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
try:
    article.full_clean()
except ValidationError as e:
    non_field_errors = e.message_dict[NON_FIELD_ERRORS]

如何指定对于某个特定的field的校验错误信息:

class Article(models.Model):
    ...
    def clean(self):
        if self.status == 'draft' and self.pub_date is not None:
            # raise ValidationError({'pub_date': _('Draft entries may not have a publication date.')})
            raise ValidationError({'pub_date': 'Draft entries may not have a publication date.'})
        ...

如何指定多个field的校验错误信息:

class Article(models.Model):
    ...
    def clean(self):
        if self.status == 'draft' and self.pub_date is not None:
           raise ValidationError({'pub_date': 'Draft entries may not have a publication date.', 
                                  'creator': 'Creator can't be null'})
        ...

如何指定全局性校验错误信息:

class Article(models.Model):
    ...
    def clean(self):
        if self.status == 'draft' and self.pub_date is not None:
            raise ValidationError('Draft entries may not have a publication date.')
        ...

 

进入正题:

一、如何使用验证器:

在验证某个字段的时候,在模型或者自定义form表单中传递一个 validators  参数用来指定验证器,进一步对数据进行过滤。

或者,通过model中的  Field类型  或者一些参数就可以指定。

比如 EmailValidator  ,我们可以通过 指定字段类型为EmailField  来指定。

比如 MaxValueValidator  ,我们可以通过 max_value  、max_length参数来指定。

class Interview(models.Model):
    feedback = models.TextField(max_length=1024, validators=[MinLengthValidator(20, message='不少于20字')], verbose_name='面试反馈')
    mail = models.EmailField(max_length=64, blank=True, null=True, verbose_name='邮箱')
    age= models.IntegerField(max_value=64, blank=True, null=True, verbose_name='年龄')

二、常用自带验证器:

1.  MaxValueValidator  :验证最大值。

2.  MinValueValidator  :验证最小值。

3.  MinLengthValidator  :验证最小长度。

4.  MaxLengthValidator  :验证最大长度。

5.  EmailValidator  :验证是否是邮箱格式。

6.  URLValidator  :验证是否是 URL  格式。

7.  RegexValidator  :如果还需要更加复杂的验证,那么我们可以通过正则表达式的验证。

class Demo(models.Model):
  telephone = models.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])

三、自定义验证器:

方法:

如果你想要自定义model的校验,或者想要修改model的属性的话,就要重写clean()方法。

class Interview(models.Model):
    feedback = models.TextField(max_length=1024, validators=[MinLengthValidator(20, message='不少于20字')], verbose_name='面试反馈')
    mail = models.EmailField(max_length=64, blank=True, null=True, verbose_name='邮箱')
    age= models.IntegerField(max_value=64, blank=True, null=True, verbose_name='年龄'
    ...

    def clean(self):
        if self.result_1 == InterviewResult.FAIL and len(self.feedback) < 20:
            raise ValidationError({'feedback': '不少于20字'})
 

效果:

 

 

如果你想做一个全局性的错误提示,可以这样:

    ...
    def clean(self):
        if self.result_1 == InterviewResult.FAIL and len(self.feedback) < 20:
            raise ValidationError('不少于20字吧')

效果:

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中的ModelForm可以方便地创建表单,同时也可以对表单进行验证。以下是一些常见的ModelForm验证方式: 1. 必填字段验证 使用required=True参数可以指定一个字段为必填项,如果该字段为空,则会抛出ValidationError异常。 例如: ```python class MyForm(forms.ModelForm): class Meta: model = MyModel fields = ['name', 'age'] name = forms.CharField(required=True) age = forms.IntegerField(required=True) ``` 2. 字段类型验证 使用cleaned_data获取表单数据,并使用isinstance函数对字段类型进行验证。 例如: ```python class MyForm(forms.ModelForm): class Meta: model = MyModel fields = ['name', 'age'] name = forms.CharField(required=True) age = forms.IntegerField(required=True) def clean_age(self): age = self.cleaned_data.get('age') if not isinstance(age, int): raise forms.ValidationError('年龄必须是整数') return age ``` 3. 自定义验证 可以通过自定义clean_<字段名>函数来进行字段的自定义验证。如果该函数返回一个值,则会将该值作为字段的值,否则将抛出ValidationError异常。 例如: ```python from django.core.exceptions import ValidationError class MyForm(forms.ModelForm): class Meta: model = MyModel fields = ['name', 'age'] name = forms.CharField(required=True) age = forms.IntegerField(required=True) def clean(self): cleaned_data = super().clean() name = cleaned_data.get('name') age = cleaned_data.get('age') if name and age and name == '张三' and age < 18: raise ValidationError('未满18岁的张三不允许注册') ``` 以上是一些常见的ModelForm验证方式,可以根据实际需求进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值