驗證器是一個可調(diào)用的對象,它接受一個值,并在不符合一些規(guī)則時拋出ValidationError
異常。驗證器有助于在不同類型的字段之間重復(fù)使用驗證邏輯。
例如,這個驗證器只允許偶數(shù):
from django.core.exceptions import ValidationError
def validate_even(value):
if value % 2 != 0:
raise ValidationError('%s is not an even number' % value)
你可以通過字段的validators
參數(shù)將它添加到模型字段中:
from django.db import models
class MyModel(models.Model):
even_field = models.IntegerField(validators=[validate_even])
由于值在驗證器運行之前會轉(zhuǎn)化為Python,你可以在表單上使用相同的驗證器:
from django import forms
class MyForm(forms.Form):
even_field = forms.IntegerField(validators=[validate_even])
你也可以使用帶有 __call__()
方法的類,來實現(xiàn)更復(fù)雜或可配置的驗證器。例如,RegexValidator
就用了這種技巧。如果一個基于類的驗證器用于validators
模型字段的選項,你應(yīng)該通過添加deconstruct() 和__eq__()
方法確保它可以被遷移框架序列化。
關(guān)于驗證器如何在表單中運行,詳見表單驗證 。關(guān)于它們?nèi)绾卧谀P椭羞\行,詳見 驗證對象。要注意驗證器不會在你保存模型時自動運行,但是如果你使用ModelForm
,它會在任何你表單包含的字段上運行你的驗證器。關(guān)于模型驗證器如何和表單交互,詳見ModelForm 文檔。
django.core.validators
模塊包含了一系列的可調(diào)用驗證器,用于模型和表單字段。它們在內(nèi)部使用,但是也可以用在你自己的字段上。它們可以用在field.clean()
方法之外,或者代替它。
class RegexValidator
([regex=None, message=None, code=None, _inversematch=None, flags=0])[source]
Parameters: | * **regex** – 如果不是`None`則覆寫 [`regex`](#django.core.validators.RegexValidator.regex "django.core.validators.RegexValidator.regex")??梢允且粋€正則表達式字符串,或者預(yù)編譯的正則表達式對象。 * **message** – 如果不是`None`,則覆寫 [`message`](#django.core.validators.RegexValidator.message "django.core.validators.RegexValidator.message")。 * **code** – 如果不是`None`,則覆寫[`code`](#django.core.validators.RegexValidator.code "django.core.validators.RegexValidator.code")。 * **inverse_match** – 如果不是`None`,則覆寫[`inverse_match`](#django.core.validators.RegexValidator.inverse_match "django.core.validators.RegexValidator.inverse_match")。 * **flags** – 如果不是`None`,則覆寫 [`flags`](#django.core.validators.RegexValidator.flags "django.core.validators.RegexValidator.flags")。這種情況下,[`regex`](#django.core.validators.RegexValidator.regex "django.core.validators.RegexValidator.regex") ,必須是正則表達式字符串,否則拋出[`TypeError`](https://docs.python.org/3/library/exceptions.html#TypeError) 異常。 |
---|
regex
用于搜索提供的value
的正則表達式,或者是預(yù)編譯的正則表達式對象。通常在找不到匹配時拋出帶有 message
和code
的 ValidationError
異常。這一標準行為可以通過設(shè)置inverse_match
為True
來反轉(zhuǎn),這種情況下,如果找到匹配則拋出 ValidationError
異常。通常它會匹配任何字符串(包括空字符串)。
message
驗證失敗時ValidationError
所使用的錯誤信息。默認為"Enter a valid value"
。
code
驗證失敗時ValidationError
所使用的錯誤代碼。默認為"invalid"
。
inverse_match
New in Django 1.7.
regex
的匹配模式。默認為False
。
flags
New in Django 1.7.
編譯正則表達式字符串regex
時所用的標識。如果regex
是預(yù)編譯的正則表達式,并且覆寫了flags
,會產(chǎn)生TypeError
異常。默認為 0。
class EmailValidator
([message=None, code=None, whitelist=None])[source]
Parameters: | * **message** – 如果不是 `None`,則覆寫[`message`](#django.core.validators.EmailValidator.message "django.core.validators.EmailValidator.message")。 * **code** – 如果不是 `None`,則覆寫[`code`](#django.core.validators.EmailValidator.code "django.core.validators.EmailValidator.code")。 * **whitelist** – 如果不是`None`,則覆寫 [`whitelist`](#django.core.validators.EmailValidator.whitelist "django.core.validators.EmailValidator.whitelist")。 |
---|
message
驗證失敗時ValidationError
所使用的錯誤信息。默認為"Enter a valid email address"
。
code
驗證失敗時ValidationError
所使用的錯誤代碼。默認為"invalid"
。
whitelist
所允許的郵件域名的白名單。通常,正則表達式(domain_regex
屬性) 用于驗證 @ 符號后面的任何東西。但是,如果這個字符串在白名單里,就可以通過驗證。如果沒有提供,默認的白名單是 ['localhost']
。其它不包含點符號的域名不能通過驗證,所以你需要按需將它們添加進白名單。
class URLValidator
([schemes=None, regex=None, message=None, code=None])[source]
RegexValidator
確保一個值看起來像是URL,并且如果不是的話產(chǎn)生'invalid'
錯誤代碼。
回送地址以及保留的IP空間被視為有效。同時也支持字面的IPv6地址 (RFC 2732) 以及unicode域名。
除了父類RegexValidator
的可選參數(shù)之外,URLValidator
接受一個額外的可選屬性:
schemes
需要驗證的URL/URI模式列表。如果沒有提供,默認為 ['http', 'https', 'ftp', 'ftps']
。IANA 網(wǎng)站提供了 有效的URI模式的完整列表作為參考。
Changed in Django 1.7:
添加了可選的schemes
屬性。
Changed in Django 1.8:
添加了對IPv6 地址, unicode 域名, 以及含有驗證信息的URL的支持。
validate_email
一個不帶有任何自定義的EmailValidator
實例。
validate_slug
一個 RegexValidator
實例,確保值只含有字母、數(shù)字、下劃線和連字符。
validate_ipv4_address
一個RegexValidator
的實例,確保值是IPv4地址。
validate_ipv6_address
[source]
使用django.utils.ipv6
來檢查是否是 IPv6 地址。
validate_ipv46_address
[source]
使用validate_ipv4_address
和 validate_ipv6_address
值是有效的 IPv4 或 IPv6 地址。
validate_comma_separated_integer_list
一個RegexValidator
的實例,確保值是整數(shù)的逗號分隔列表。
class MaxValueValidator
(_maxvalue, message=None)[source]
如果value
大于 max_value
,拋出帶有'max_value'
代碼的ValidationError
異常。
Changed in Django 1.8:
添加了message
參數(shù)。
class MinValueValidator
(_minvalue, message=None)[source]
如果value
小于min_value
,拋出帶有'min_value'
代碼的ValidationError
異常。
Changed in Django 1.8:
添加了message
參數(shù)。
class MaxLengthValidator
(_maxlength, message=None)[source]
如果value
的長度大于max_length
,拋出帶有'max_length'
代碼的ValidationError
異常。
Changed in Django 1.8:
添加了message
參數(shù)。
class MinLengthValidator
(_minlength, message=None)[source]
如果value
的長度小于min_length
,拋出帶有'min_length'
代碼的ValidationError
異常。
Changed in Django 1.8:
添加了message
參數(shù)。
譯者:Django 文檔協(xié)作翻譯小組,原文:Data validation。
本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請保留作者署名和文章出處。
Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。