Skip to main content

验证器

写验证器

验证器是一个可调用的,如果它不满足某些标准,它接受一个值并产生一个 ValidationError。验证器可用于在不同类型的字段之间重新使用验证逻辑。

例如,这里的验证器只允许偶数:

from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_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 模型字段选项中使用基于类的验证器,则应通过添加 解构()__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 2732)和unicode域。

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

schemes

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

validate_email

validate_email

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

validate_slug

validate_slug

确保值仅由字母,数字,下划线或连字符组成的 RegexValidator 实例。

validate_unicode_slug

validate_unicode_slug
New in Django 1.9.

确保值仅由Unicode字母,数字,下划线或连字符组成的 RegexValidator 实例。

validate_ipv4_address

validate_ipv4_address

确保值类似于IPv4地址的 RegexValidator 实例。

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)
New in Django 1.9.

返回一个 RegexValidator 实例,确保一个字符串由以 sep 分隔的整数组成。当 allow_negativeTrue 时,它允许负整数。

Changed in Django 1.10:

添加了 allow_negative 参数。

MaxValueValidator

class MaxValueValidator(max_value, message=None)[源代码]

如果 value 大于 max_value,则使用 'max_value' 的代码提出 ValidationError

MinValueValidator

class MinValueValidator(min_value, message=None)[源代码]

如果 value 小于 min_value,则使用 'min_value' 的代码提高 ValidationError

MaxLengthValidator

class MaxLengthValidator(max_length, message=None)[源代码]

如果 value 的长度大于 max_length,则使用 'max_length' 的代码提出 ValidationError

MinLengthValidator

class MinLengthValidator(min_length, message=None)[源代码]

如果 value 的长度小于 min_length,则使用 'min_length' 的代码来提高 ValidationError

DecimalValidator

class DecimalValidator(max_digits, decimal_places)
New in Django 1.9.

使用以下代码升级 ValidationError

  • 'max_digits' 如果位数大于 max_digits

  • 'max_decimal_places',如果小数位数大于 decimal_places

  • 'max_whole_digits',如果整数位数大于 max_digitsdecimal_places 之间的差值。