验证器是一个可调用的对象,它接受一个值,并在不符合一些规则时抛出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
¶RegexValidator
(regex=None, message=None, code=None, inverse_match=None, flags=0)[source]¶参数: |
---|
regex
¶在提供的value
中搜索的正则表达式模式,或预编译的正则表达式。 通常在找不到匹配时抛出带有 message
和code
的 ValidationError
异常。 这一标准行为可以通过设置inverse_match
为True
来反转,这种情况下,如果找到匹配则抛出 ValidationError
异常。 通常它会匹配任何字符串(包括空字符串)。
message
¶验证失败时ValidationError
所使用的错误信息。
默认为"Enter a valid value"
。
code
¶验证失败时ValidationError
所使用的错误代码。 默认为"invalid"
。
EmailValidator
¶EmailValidator
(message=None, code=None, whitelist=None)[source]¶参数: |
---|
message
¶验证失败时ValidationError
所使用的错误信息。
默认为"Enter a valid email address"
。
code
¶验证失败时ValidationError
所使用的错误代码。 默认为"invalid"
。
whitelist
¶所允许的邮件域名的白名单。 通常,正则表达式(domain_regex
属性) 用于验证 @ 符号后面的任何东西。 但是,如果这个字符串在白名单里,就可以通过验证。 如果没有提供,默认的白名单是 ['localhost']
。 其它不包含点符号的域名不能通过验证,所以你需要按需将它们添加进白名单。
URLValidator
¶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_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
时,它允许负整数。
添加了allow_negative
参数。
MaxValueValidator
¶MaxValueValidator
(max_value, message=None)[source]¶如果value
大于max_value
,抛出code为'max_value'
的ValidationError
异常。
MinValueValidator
¶MinValueValidator
(min_value, message=None)[source]¶如果value
小于min_value
,抛出code为'min_value'
的ValidationError
异常。
MaxLengthValidator
¶MaxLengthValidator
(max_length, message=None)[source]¶如果value
的长度大于max_length
,抛出code为'max_length'
的ValidationError
异常。
MinLengthValidator
¶MinLengthValidator
(min_length, message=None)[source]¶如果value
的长度小于min_length
,抛出code为'min_length'
的ValidationError
异常。
DecimalValidator
¶DecimalValidator
(max_digits, decimal_places)[source]¶使用以下代码引发ValidationError
:
'max_digits'
如果位数大于max_digits
。'max_decimal_places'
如果小数位数大于decimal_places
。max_digits
和decimal_places
之间的差异,则'max_whole_digits'
。FileExtensionValidator
¶FileExtensionValidator
(allowed_extensions, message, code)[source]¶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
.
警告
不要依赖文件扩展名的验证来确定文件的类型。 无论文件包含什么数据,文件都可以重命名为任何扩展名。
2017年9月6日