验证器 — Django 文档

来自菜鸟教程
Django/docs/3.0.x/ref/validators
跳转至:导航、​搜索

验证器

编写验证器

验证器是一个可调用的,它接受一个值并在它不满足某些条件时引发 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)
参数
  • regex – 如果不是 None,则覆盖 regex。 可以是正则表达式字符串或预编译的正则表达式。

  • message – 如果不是 None,则覆盖 message

  • code – 如果不是 None,则覆盖 code

  • inverse_match – 如果不是 None,则覆盖 inverse_match

  • flags – 如果不是 None,则覆盖 flags。 在这种情况下, regex 必须是正则表达式字符串,否则会引发 TypeError

regex

要在提供的 value 或预编译的正则表达式中搜索的正则表达式模式。 默认情况下,如果未找到匹配项,则使用 messagecode 引发 ValidationError。 该标准行为可以通过将 inverse_match 设置为 True 来逆转,在这种情况下,ValidationError 在找到匹配 时引发 。 默认情况下,匹配任何字符串(包括空字符串)。

message

ValidationError 在验证失败时使用的错误消息。 默认为 "Enter a valid value"

code

ValidationError 验证失败时使用的错误代码。 默认为 "invalid"

inverse_match

regex 的匹配模式。 默认为 False

flags

编译正则表达式字符串 regex 时使用的标志。 如果 regex 是预编译的正则表达式,并且 flags 被覆盖,则引发 TypeError。 默认为 0


EmailValidator

class EmailValidator(message=None, code=None, whitelist=None)
参数
  • message – 如果不是 None,则覆盖 message

  • code – 如果不是 None,则覆盖 code

  • whitelist – 如果不是 None,则覆盖 whitelist

message

ValidationError 在验证失败时使用的错误消息。 默认为 "Enter a valid email address"

code

ValidationError 验证失败时使用的错误代码。 默认为 "invalid"

whitelist

允许的电子邮件域白名单。 默认情况下,正则表达式(domain_regex 属性)用于验证@ 符号后出现的任何内容。 但是,如果该字符串出现在白名单中,则会绕过此验证。 如果未提供,则默认白名单为 ['localhost']。 其他不包含点的域不会通过验证,因此您需要根据需要将它们列入白名单。


URLValidator

class URLValidator(schemes=None, regex=None, message=None, code=None)

一个 RegexValidator 确保一个值看起来像一个 URL,如果不是,则引发 'invalid' 的错误代码。

环回地址和保留的 IP 空间被认为是有效的。 文字 IPv6 地址 (RFC 3986#section-3.2.2) 和 unicode 域都受支持。

除了其父类 RegexValidator 的可选参数外,URLValidator 还接受一个额外的可选属性:

schemes

要验证的 URL/URI 方案列表。 如果未提供,则默认列表为 ['http', 'https', 'ftp', 'ftps']。 作为参考,IANA 网站提供了 有效 URI 方案 的完整列表。


validate_email

validate_email
一个没有任何自定义的 EmailValidator 实例。


validate_slug

validate_slug
一个 RegexValidator 实例,可确保值仅由字母、数字、下划线或连字符组成。


validate_unicode_slug

validate_unicode_slug
一个 RegexValidator 实例,可确保值仅由 Unicode 字母、数字、下划线或连字符组成。


validate_ipv4_address

validate_ipv4_address
一个 RegexValidator 实例,确保一个值看起来像一个 IPv4 地址。


validate_ipv6_address

validate_ipv6_address
使用 django.utils.ipv6 检查 IPv6 地址的有效性。


validate_ipv46_address

validate_ipv46_address
使用 validate_ipv4_addressvalidate_ipv6_address 来确保值是有效的 IPv4 或 IPv6 地址。


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)
返回一个 RegexValidator 实例,该实例确保字符串由由 sep 分隔的整数组成。 当 allow_negativeTrue 时,它允许使用负整数。


MaxValueValidator

class MaxValueValidator(limit_value, message=None)

如果 value 大于 limit_value,则引发代码为 'max_value'ValidationError,这可能是可调用的。

在 2.2 版更改:limit_value 现在可以是可调用的。


MinValueValidator

class MinValueValidator(limit_value, message=None)

如果 value 小于 limit_value,则引发代码为 'min_value'ValidationError,这可能是可调用的。

在 2.2 版更改:limit_value 现在可以是可调用的。


MaxLengthValidator

class MaxLengthValidator(limit_value, message=None)

如果 value 的长度大于 limit_value,则引发代码为 'max_length'ValidationError,这可能是可调用的。

在 2.2 版更改:limit_value 现在可以是可调用的。


MinLengthValidator

class MinLengthValidator(limit_value, message=None)

如果 value 的长度小于 limit_value,则引发代码为 'min_length'ValidationError,这可能是可调用的。

在 2.2 版更改:limit_value 现在可以是可调用的。


DecimalValidator

class DecimalValidator(max_digits, decimal_places)
使用以下代码引发 ValidationError
  • 'max_digits' 如果位数大于 max_digits
  • 'max_decimal_places' 如果小数位数大于 decimal_places
  • 'max_whole_digits' 如果整数位数大于 max_digitsdecimal_places 之间的差值。


FileExtensionValidator

class FileExtensionValidator(allowed_extensions, message, code)

如果未找到 value.name 的扩展名(valueFile),则引发 ValidationError 代码为 'invalid_extension'allowed_extensions。 扩展名与 allowed_extensions 不区分大小写。

警告

不要依赖文件扩展名的验证来确定文件的类型。 文件可以重命名为具有任何扩展名,无论它们包含什么数据。


validate_image_file_extension

validate_image_file_extension
使用 Pillow 确保 value.namevalueFile)具有 有效的图像扩展名


ProhibitNullCharactersValidator

class ProhibitNullCharactersValidator(message=None, code=None)

如果 str(value) 包含一个或多个空字符 ('\x00'),则引发 ValidationError

参数
  • message – 如果不是 None,则覆盖 message

  • code – 如果不是 None,则覆盖 code

message

ValidationError 在验证失败时使用的错误消息。 默认为 "Null characters are not allowed."

code

ValidationError 验证失败时使用的错误代码。 默认为 "null_characters_not_allowed"