验证器¶
编写验证器¶
验证器是一个可调用对象,它接收一个值,并在该值不满足某些条件时引发 ValidationError。验证器可用于在不同类型的字段之间重用验证逻辑。
例如,以下是一个仅允许偶数的验证器
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
def validate_even(value):
if value % 2 != 0:
raise ValidationError(
_("%(value)s is not an even number"),
params={"value": value},
)
您可以通过字段的 validators 参数将其添加到模型字段。
from django.db import models
class MyModel(models.Model):
even_field = models.IntegerField(validators=[validate_even])
因为在运行验证器之前值会被转换为 Python,所以您甚至可以在表单中使用相同的验证器。
from django import forms
class MyForm(forms.Form):
even_field = forms.IntegerField(validators=[validate_even])
您还可以使用具有 __call__() 方法的类来创建更复杂或可配置的验证器。例如,RegexValidator 使用了此技术。如果在 validators 模型字段选项中使用了基于类的验证器,则应确保它通过添加 可由迁移框架序列化 deconstruct() 和 __eq__() 方法。
验证器如何运行¶
有关验证器在表单中如何运行的更多信息,请参阅 表单验证,以及有关它们在模型中如何运行的信息,请参阅 验证对象。请注意,保存模型时不会自动运行验证器,但如果您使用的是 ModelForm,它将在表单中包含的任何字段上运行您的验证器。有关模型验证如何与表单交互的信息,请参阅 ModelForm 文档。
内置验证器¶
django.core.validators 模块包含一系列可调用的验证器,可用于模型和表单字段。它们在内部使用,但也可以与您自己的字段一起使用。它们可以与自定义 field.clean() 方法一起使用,或作为替代。
RegexValidator¶
- class RegexValidator(regex=None, message=None, code=None, inverse_match=None, flags=0)[source]¶
- 参数:
RegexValidator使用re.search()在提供的value中搜索给定的正则表达式。默认情况下,如果未找到匹配项,则会引发带有message和code的ValidationError。可以通过将inverse_match设置为True来反转其行为,在这种情况下,当找到匹配项时会引发ValidationError。- regex¶
在提供的
value中搜索的正则表达式模式,使用re.search()。这可以是字符串或使用re.compile()创建的预编译正则表达式。默认为空字符串,它将在每个可能的value中找到。
- message¶
如果验证失败,
ValidationError使用的错误消息。默认为"Enter a valid value"。
- code¶
如果验证失败,
ValidationError使用的错误代码。默认为"invalid"。
EmailValidator¶
- class EmailValidator(message=None, code=None, allowlist=None)[source]¶
- 参数:
EmailValidator确保值看起来像电子邮件,如果值不符合要求,则会使用message和code抛出ValidationError。长度超过 320 个字符的值始终被视为无效。- message¶
如果验证失败,
ValidationError使用的错误消息。默认为"Enter a valid email address"。
- code¶
如果验证失败,
ValidationError使用的错误代码。默认为"invalid"。
- allowlist¶
电子邮件域的白名单。默认情况下,使用正则表达式(
domain_regex属性)来验证 @ 符号后出现的内容。但是,如果该字符串出现在allowlist中,则会绕过此验证。如果未提供,则默认的allowlist为['localhost']。不包含点的其他域名将无法通过验证,因此您需要根据需要将它们添加到allowlist中。
DomainNameValidator¶
- class DomainNameValidator(accept_idna=True, message=None, code=None)[source]¶
RegexValidator的子类,用于确保值看起来像域名。长度超过 255 个字符的值始终被视为无效。IP 地址不被视为有效的域名。除了其父类
RegexValidator的可选参数外,DomainNameValidator还接受一个额外的可选属性- accept_idna¶
确定是否接受国际化域名,即包含非 ASCII 字符的域名。默认为
True。
URLValidator¶
- class URLValidator(schemes=None, regex=None, message=None, code=None)[source]¶
RegexValidator的子类,用于确保值看起来像 URL,如果不符合要求,则会抛出错误代码'invalid'。长度超过max_length个字符的值始终被视为无效。环回地址和保留的 IP 空间被视为有效。字面 IPv6 地址(RFC 3986 第 3.2.2 节)和 Unicode 域名都受支持。
除了其父类
RegexValidator的可选参数外,URLValidator还接受一个额外的可选属性- schemes¶
要验证的 URL/URI 方案列表。如果未提供,则默认列表为
['http', 'https', 'ftp', 'ftps']。作为参考,IANA 网站提供了 有效 URI 方案 的完整列表。警告
即使提供了
file方案,以file:///开头的值也不会通过验证。有效值必须包含主机。
- max_length¶
可以视为有效的值的最大长度。默认为 2048 个字符。
validate_email¶
- validate_email¶
一个没有任何自定义的
EmailValidator实例。
validate_domain_name¶
- validate_domain_name¶
一个没有任何自定义的
DomainNameValidator实例。
validate_slug¶
- validate_slug¶
一个
RegexValidator实例,用于确保值仅包含字母、数字、下划线或连字符。
validate_unicode_slug¶
- validate_unicode_slug¶
一个
RegexValidator实例,用于确保值仅包含 Unicode 字母、数字、下划线或连字符。
validate_ipv4_address¶
- validate_ipv4_address[source]¶
一个
RegexValidator实例,用于确保值看起来像一个 IPv4 地址。
validate_ipv6_address¶
validate_ipv46_address¶
validate_comma_separated_integer_list¶
- validate_comma_separated_integer_list¶
一个
RegexValidator实例,用于确保值是一个用逗号分隔的整数列表。
int_list_validator¶
- int_list_validator(sep=',', message=None, code='invalid', allow_negative=False)[source]¶
返回一个
RegexValidator实例,用于确保字符串由用sep分隔的整数组成。当allow_negative为True时,它允许负整数。
MaxValueValidator¶
- class MaxValueValidator(limit_value, message=None)[source]¶
如果
value大于limit_value(可能是一个可调用对象),则引发一个代码为'max_value'的ValidationError。
MinValueValidator¶
- class MinValueValidator(limit_value, message=None)[source]¶
如果
value小于limit_value(可能是一个可调用对象),则引发一个代码为'min_value'的ValidationError。
MaxLengthValidator¶
- class MaxLengthValidator(limit_value, message=None)[source]¶
如果
value的长度大于limit_value(可能是一个可调用对象),则引发一个代码为'max_length'的ValidationError。
MinLengthValidator¶
- class MinLengthValidator(limit_value, message=None)[source]¶
如果
value的长度小于limit_value(可能是一个可调用对象),则引发一个代码为'min_length'的ValidationError。
DecimalValidator¶
- class DecimalValidator(max_digits, decimal_places)[source]¶
引发以下代码的
ValidationError'max_digits'如果数字位数大于max_digits。'max_decimal_places'如果小数位数大于decimal_places。'max_whole_digits'如果整数位数大于max_digits和decimal_places的差值。
FileExtensionValidator¶
- class FileExtensionValidator(allowed_extensions, message, code)[source]¶
如果
value.name(value是一个File)的扩展名未在allowed_extensions中找到,则引发一个代码为'invalid_extension'的ValidationError。扩展名与allowed_extensions进行不区分大小写的比较。警告
不要依赖文件扩展名的验证来确定文件的类型。无论文件包含什么数据,都可以将其重命名为任何扩展名。
validate_image_file_extension¶
ProhibitNullCharactersValidator¶
- class ProhibitNullCharactersValidator(message=None, code=None)[source]¶
如果
str(value)包含一个或多个空字符('\x00'),则引发ValidationError。- message¶
如果验证失败,则
ValidationError使用的错误消息。默认为"Null characters are not allowed."。
- code¶
如果验证失败,则
ValidationError使用的错误代码。默认为"null_characters_not_allowed"。
StepValueValidator¶
- class StepValueValidator(limit_value, message=None, offset=None)[source]¶
如果
value不是limit_value的整数倍,则引发带有代码'step_size'的ValidationError,其中limit_value可以是浮点数、整数或十进制值,也可以是可调用对象。当设置了offset时,验证针对limit_value加上offset进行。例如,对于StepValueValidator(3, offset=1.4),有效值包括1.4、4.4、7.4、10.4等。Django 5.0 中的更改添加了
offset参数。