Validator(验证器)

编写验证器

验证器是一个可调用的对象,它接受一个值,并在不符合一些规则时抛出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模型字段的选项,你应该通过添加deconstruct()__eq__() 方法确保它可以serializable by the migration framework

验证器如何运行

关于验证器如何在表单中运行,详见form validation 。关于它们如何在模型中运行,详见 Validating objects 要注意验证器不会在你保存模型时自动运行,但是如果你使用ModelForm,它会在任何你表单包含的字段上运行你的验证器。 关于模型验证器如何和表单交互,详见ModelForm documentation

内置验证器

django.core.validators模块包含了一系列的可调用验证器,用于模型和表单字段。 它们在内部使用,但是也可以用在你自己的字段上。 它们可以用在field.clean() 方法之外,或者代替它。

RegexValidator

class RegexValidator(regex=None, message=None, code=None, inverse_match=None, flags=0)[source]
参数:
  • regex – 如果不是None则覆写 regex 可以是一个正则表达式字符串,或者预编译的正则表达式对象。
  • message – 如果不是None,则覆写 message
  • code – 如果不是None,则覆写code
  • inverse_match – 如果不是None,则覆写inverse_match
  • flags – 如果不是None,则覆写 flags 这种情况下,regex ,必须是正则表达式字符串,否则抛出TypeError 异常。
regex

在提供的value中搜索的正则表达式模式,或预编译的正则表达式。 通常在找不到匹配时抛出带有 messagecodeValidationError异常。 这一标准行为可以通过设置inverse_matchTrue来反转,这种情况下,如果找到匹配则抛出 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)[source]
参数:
  • 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)[source]

RegexValidator确保一个值看起来像是URL,并且如果不是的话产生'invalid'错误代码。

回送地址以及保留的IP空间被视为有效。 同时也支持字面的IPv6地址 (RFC 2732) 以及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

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

validate_ipv4_address

validate_ipv4_address

一个RegexValidator的实例,确保值是IPv4地址。

validate_ipv6_address

validate_ipv6_address[source]

使用django.utils.ipv6 来检查是否是 IPv6 地址。

validate_ipv46_address

validate_ipv46_address[source]

使用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)[source]

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

在Django更改1.10:

添加了allow_negative参数。

MaxValueValidator

class MaxValueValidator(max_value, message=None)[source]

如果value大于max_value,抛出code为'max_value'ValidationError异常。

MinValueValidator

class MinValueValidator(min_value, message=None)[source]

如果value小于min_value,抛出code为'min_value'ValidationError异常。

MaxLengthValidator

class MaxLengthValidator(max_length, message=None)[source]

如果value的长度大于max_length,抛出code为'max_length'ValidationError异常。

MinLengthValidator

class MinLengthValidator(min_length, message=None)[source]

如果value的长度小于min_length,抛出code为'min_length'ValidationError异常。

DecimalValidator

class DecimalValidator(max_digits, decimal_places)[source]

使用以下代码引发ValidationError

  • 'max_digits'如果位数大于max_digits
  • 'max_decimal_places'如果小数位数大于decimal_places
  • 如果整数数字大于max_digitsdecimal_places之间的差异,则'max_whole_digits'

FileExtensionValidator

class FileExtensionValidator(allowed_extensions, message, code)[source]
Django中的新功能1.11。

Raises a ValidationError with a code of 'invalid_extension' if the extension of value.name (value is a File) isn’t found in allowed_extensions.

警告

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

validate_image_file_extension

validate_image_file_extension
Django中的新功能1.11。

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