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字吧')

效果:

 

Django中的邮箱正则表达式是用于验证输入的邮箱地址是否符合规范。 在Django中,邮箱的正则表达式被定义在email模块中的`validators`中。一般而言,邮箱的正则表达式遵循以下规则: 1. 邮箱的格式由用户名和域名组成,中间用@符号连接。域名可以是IP地址或者主机名,例如"example@example.com"。 2. 用户名通常由字母、数字、下划线和特殊字符组成,长度可以是1到64个字符。 3. 域名由一个或多个标签组成,标签之间用`.`分隔。标签由字母、数字和连字符组成,长度可以是1到63个字符。例如"example.com"。 4. 不允许出现连续的`.`符号。 5. 域名后缀由字母和数字组成,长度可以是2到6个字符。例如".com"。 Django中的邮箱正则表达式示例:`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}` 这个正则表达式的含义是:邮箱的用户名可以由大小写字母、数字、下划线、百分号、加号、减号和点号组成;域名可以由大小写字母、数字、连字符和点号组成;域名后缀可以由大小写字母组成,长度为2到6个字符。 在Django中,可以使用该正则表达式进行邮箱验证,以保证输入的邮箱地址符合规范,有效性。例如,在模型类的字段中可以使用`validators`参数来设置邮箱验证规则,示例代码如下: ```python from django.db import models from django.core.validators import RegexValidator class MyModel(models.Model): email = models.EmailField(validators=[RegexValidator( regex=r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}', message='请输入有效的邮箱地址' )]) ``` 这样,在保存数据时,如果邮箱地址不符合规范,Django会抛出`ValidationError`异常,提示用户输入有效的邮箱地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值