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