验证器是一个可调用函数,它接受一个值并引发 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 模型字段选项,您应该确保它是 serializable by the migration framework 通过添加 deconstruct() 和 __eq__() 方法。
见 form validation 有关如何在窗体中运行验证器的详细信息,以及 Validating objects 他们是如何在模型中运行的。请注意,在保存模型时,验证程序不会自动运行,但如果使用的是 ModelForm ,它将在表单中包含的任何字段上运行验证程序。见 ModelForm documentation 有关模型验证如何与表单交互的信息。
这个 django.core.validators 模块包含用于模型和表单字段的可调用验证器集合。它们在内部使用,但也可用于您自己的字段。它们可以用来补充或代替习俗。 field.clean() 方法。
RegexValidator¶A RegexValidator 搜索提供的 value 对于给定的正规表达式, re.search() .默认情况下,引发 ValidationError 使用 message 和 code 如果匹配 is not 找到了。它的行为可以通过设置来逆转 inverse_match 至 True ,在这种情况下, ValidationError 比赛时提出 is found.
要在提供的 value ,使用 re.search() .这可能是字符串或使用 re.compile() .返回到空字符串,它将在所有可能的 value 。
错误消息由使用 ValidationError 如果验证失败。默认为 "Enter a valid value" .
使用的错误代码 ValidationError 如果验证失败。默认为 "invalid" .
EmailValidator¶一个 EmailValidator 确保值看起来像电子邮件,并引发 ValidationError 使用 message 和 code 如果不是,则长度超过320个字符的值始终被视为无效。
错误消息由使用 ValidationError 如果验证失败。默认为 "Enter a valid email address" .
使用的错误代码 ValidationError 如果验证失败。默认为 "invalid" .
电子邮件域的允许列表。默认情况下,是一个规则表达( domain_regex 属性)用于验证在 @ 标志.但是,如果该字符串出现在 allowlist ,此验证被绕过。如果未提供,默认为 allowlist 是 ['localhost'] .其他不包含点的域无法通过验证,因此您需要将它们添加到 allowlist 根据需要。
DomainNameValidator¶A RegexValidator 确保值看起来像域名的子集。超过255个字符的值始终被视为无效。IP地址不被接受为有效域名。
除了其父的可选参数之外 RegexValidator 班级, DomainNameValidator 接受额外的可选属性:
确定是否接受国际化域名,即包含非ASC字符的域名。默认为 True 。
URLValidator¶A RegexValidator 确保值看起来像URL的子类,并引发错误代码 'invalid' 如果不是这样的话。值大于 max_length 字符始终被认为是无效的。
环回地址和保留的IP空间被视为有效。字面IPv6地址 (RFC 3986 Section 3.2.2 )和Unicode域都支持。
除了其父级的可选参数之外 RegexValidator 类, URLValidator 接受额外的可选属性:
要验证的URL/URI方案列表。如果未提供,则默认列表为 ['http', 'https', 'ftp', 'ftps'] . 作为参考,IANA网站提供了 valid URI schemes .
警告
价值观始于 file:/// 即使当 file 方案已提供。有效值必须包含主机。
可以被视为有效的值的最大长度。默认为2048个字符。
validate_email¶安 EmailValidator 没有任何自定义的实例。
validate_domain_name¶A DomainNameValidator 实例,无需任何自定义。
validate_slug¶A RegexValidator 确保值仅由字母、数字、下划线或连字符组成的实例。
validate_unicode_slug¶A RegexValidator 确保值仅由Unicode字母、数字、下划线或连字符组成的实例。
validate_ipv4_address¶A RegexValidator 确保值类似于IPv4地址的实例。
validate_ipv6_address¶validate_ipv46_address¶validate_comma_separated_integer_list¶A RegexValidator 确保值是以逗号分隔的整数列表的实例。
int_list_validator¶返回A RegexValidator 确保字符串由整数组成的实例 sep . 它允许负整数,当 allow_negative 是 True .
MaxValueValidator¶提出一个 ValidationError 用一个代码 'max_value' 如果 value 大于 limit_value 可能是可调用的。
MinValueValidator¶提出一个 ValidationError 用一个代码 'min_value' 如果 value 小于 limit_value 可能是可调用的。
MaxLengthValidator¶提出一个 ValidationError 用一个代码 'max_length' 如果 value 大于 limit_value 可能是可调用的。
MinLengthValidator¶提出一个 ValidationError 用一个代码 'min_length' 如果 value 小于 limit_value 可能是可调用的。
DecimalValidator¶加薪 ValidationError 使用以下代码:
'max_digits' 如果位数大于 max_digits .
'max_decimal_places' 如果小数位数大于 decimal_places .
'max_whole_digits' 如果整数位数大于 max_digits 和 decimal_places .
FileExtensionValidator¶提出一个 ValidationError 用一个代码 'invalid_extension' 如果延长 value.name (value 是一个 File )在中找不到 allowed_extensions . 将扩展与不敏感的大小写进行比较 allowed_extensions .
警告
不要依赖文件扩展名的验证来确定文件的类型。无论文件包含什么数据,都可以重命名为具有任何扩展名。
validate_image_file_extension¶使用枕头确保 value.name (value 是一个 File 有 a valid image extension .
ProhibitNullCharactersValidator¶引发了一个 ValidationError 如果 str(value) 包含一个或多个空字符 ('\x00' )。
错误消息由使用 ValidationError 如果验证失败。默认为 "Null characters are not allowed." .
使用的错误代码 ValidationError 如果验证失败。默认为 "null_characters_not_allowed" .
StepValueValidator¶引发了一个 ValidationError 其代码为 'step_size' 如果 value 不是的整数倍 limit_value ,它可以是浮点数、整数值或小数值,也可以是可调用的。什么时候 offset ,则验证将针对 limit_value 加 offset 。例如,对于 StepValueValidator(3, offset=1.4) 有效值包括 1.4 , 4.4 , 7.4 , 10.4 以此类推。
5月 28, 2025