Django 常用9大内置验证器指南​

前言:验证器执行流程

通过
失败
通过
失败
通过
失败
用户提交数据
字段级验证
方法级验证
返回错误
表单级验证
保存数据

一、验证器基础概念

作用:对字段值进行原子化校验,确保数据合规性
​执行时机​​:在调用is_valid()或保存模型时自动触发
​优势​​:

  • 可复用性:一次定义,多处使用
  • 声明式配置:通过参数控制校验逻辑
  • 统一标准:模型、表单、序列化器共享验证规则

二、核心内置验证器详解

1. MinLengthValidator 最小长度验证

  • 特点:确保输入字符数≥设定值
  • 应用场景:密码、用户名、短文本
  • 参数
    • limit_value:最小字符数(必填)
    • message:自定义错误提示
from django.core.validators import MinLengthValidator

username = forms.CharField(
    validators=[MinLengthValidator(
        limit_value=4,
        message="至少输入4个字符"
    )]
)

2. MaxLengthValidator 最大长度验证

  • 特点:限制输入字符数≤设定值
  • 应用场景:简介、地址、评论内容
  • 参数
    • limit_value:最大字符数(必填)
from django.core.validators import MaxLengthValidator

bio = forms.CharField(
    validators=[MaxLengthValidator(500)],
    widget=forms.Textarea(attrs={'rows': 3})
)

3. MinValueValidator 最小值验证

  • 特点:验证数值≥设定下限
  • 应用场景:年龄、价格、库存数量
  • 参数
    • limit_value:最小值(支持int/float
from django.core.validators import MinValueValidator

age = forms.IntegerField(
    validators=[MinValueValidator(18)],
    widget=forms.NumberInput(attrs={'min': '18'})
)

4. MaxValueValidator 最大值验证

  • 特点:验证数值≤设定上限
  • 应用场景:评分、温度、百分比
  • 参数
    • limit_value:最大值
from django.core.validators import MaxValueValidator

rating = forms.IntegerField(
    validators=[MaxValueValidator(5)],
    widget=forms.NumberInput(attrs={'max': '5'})
)

5. EmailValidator 邮箱格式验证

  • 特点:符合RFC 5322标准
  • 应用场景:用户注册、联系方式
  • 参数
    • message:自定义错误提示
    • allowlist:允许的域名后缀(白名单)
from django.core.validators import EmailValidator

work_email = forms.EmailField(
    validators=[EmailValidator(
        allowlist=['company.com'],
        message="请输入企业邮箱"
    )]
)

6. URLValidator URL格式验证

  • 特点:校验标准URL格式
  • 应用场景:个人主页、API端点
  • 参数
    • schemes:允许的协议(默认['http','https','ftp','ftps']
from django.core.validators import URLValidator

portfolio = forms.URLField(
    validators=[URLValidator(schemes=['https'])],
    help_text="仅支持HTTPS链接"
)

7. RegexValidator 正则表达式验证

  • 特点:通过正则模式匹配
  • 应用场景:手机号、邮编、身份证号
  • 参数
    • regex:正则表达式(必填)
    • message:错误提示
    • flags:正则标志(如re.IGNORECASE
from django.core.validators import RegexValidator

phone = forms.CharField(
    validators=[RegexValidator(
        regex=r'^1[3-9]\d{9}$',
        message="手机号格式错误"
    )],
    widget=forms.TextInput(attrs={'pattern': '1[3-9]\\d{9}'})
)

8. FileExtensionValidator 文件扩展名验证

  • 特点:限制上传文件类型
  • 应用场景:图片、文档上传
  • 参数
    • allowed_extensions:允许的扩展名列表
from django.core.validators import FileExtensionValidator

document = forms.FileField(
    validators=[FileExtensionValidator(['pdf', 'docx'])],
    widget=forms.FileInput(attrs={'accept': '.pdf,.docx'})
)

9. MaxSizeValidator 文件大小验证

  • 特点:限制上传文件体积
  • 应用场景:防止大文件占用存储
  • 参数
    • max_size:最大字节数(如5 * 1024 * 1024表示5MB)
from django.core.validators import MaxSizeValidator

upload = forms.FileField(
    validators=[MaxSizeValidator(5 * 1024 * 1024)],
    help_text="最大支持5MB文件"
)

三、验证器组合使用示例

用户注册场景:同时校验密码长度和复杂度

from django.core.validators import MinLengthValidator, RegexValidator

password = forms.CharField(
    validators=[
        MinLengthValidator(8),
        RegexValidator(
            regex=r'^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).+$',
            message="必须包含大小写字母和数字"
        )
    ],
    widget=forms.PasswordInput()
)

商品模型定义:多规则校验商品数据

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

class Product(models.Model):
    sku = models.CharField(
        max_length=20,
        validators=[RegexValidator(r'^[A-Z]{3}-\d{6}$')]
    )
    price = models.DecimalField(
        max_digits=8,
        decimal_places=2,
        validators=[MinValueValidator(0.01)]
    )
    stock = models.IntegerField(
        validators=[MinValueValidator(0), MaxValueValidator(9999)]
    )

四、最佳实践指南
  1. 错误消息定制

    username = forms.CharField(
        validators=[MinLengthValidator(4)],
        error_messages={
            'min_length': '至少4个字符',
            'required': '该字段不能为空'
        }
    )
    
  2. 模型与表单共享验证器

    # models.py
    from django.core.validators import RegexValidator
    
    class User(models.Model):
        phone = models.CharField(
            max_length=11,
            validators=[RegexValidator(r'^1[3-9]\d{9}$')]
        )
    
    # forms.py
    class UserForm(forms.ModelForm):
        class Meta:
            model = User
            fields = ['phone']  # 自动继承模型验证器
    
  3. 性能优化

    # 缓存常用正则表达式对象
    import re
    from django.core.validators import RegexValidator
    
    PHONE_REGEX = re.compile(r'^1[3-9]\d{9}$')
    phone_validator = RegexValidator(PHONE_REGEX)
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yant224

点滴鼓励,汇成前行星光🌟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值