前言:验证器执行流程
一、验证器基础概念
作用:对字段值进行原子化校验,确保数据合规性
执行时机:在调用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)]
)
四、最佳实践指南
-
错误消息定制
username = forms.CharField( validators=[MinLengthValidator(4)], error_messages={ 'min_length': '至少4个字符', 'required': '该字段不能为空' } )
-
模型与表单共享验证器
# 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'] # 自动继承模型验证器
-
性能优化
# 缓存常用正则表达式对象 import re from django.core.validators import RegexValidator PHONE_REGEX = re.compile(r'^1[3-9]\d{9}$') phone_validator = RegexValidator(PHONE_REGEX)