驗證器是一個可調用的對象,它接受一個值,并在不符合一些規(guī)則時拋出ValidationError異常。驗證器有助于在不同類型的字段之間重復使用驗證邏輯。
例如,這個驗證器只允許偶數(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])
由于值在驗證器運行之前會轉化為Python,你可以在表單上使用相同的驗證器:
from django import forms
class MyForm(forms.Form):
even_field = forms.IntegerField(validators=[validate_even])
你也可以使用帶有 __call__()方法的類,來實現(xiàn)更復雜或可配置的驗證器。例如,RegexValidator就用了這種技巧。如果一個基于類的驗證器用于validators模型字段的選項,你應該通過添加deconstruct() 和__eq__() 方法確保它可以被遷移框架序列化。
關于驗證器如何在表單中運行,詳見表單驗證 。關于它們如何在模型中運行,詳見 驗證對象。要注意驗證器不會在你保存模型時自動運行,但是如果你使用ModelForm,它會在任何你表單包含的字段上運行你的驗證器。關于模型驗證器如何和表單交互,詳見ModelForm 文檔。
django.core.validators模塊包含了一系列的可調用驗證器,用于模型和表單字段。它們在內部使用,但是也可以用在你自己的字段上。它們可以用在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")??梢允且粋€正則表達式字符串,或者預編譯的正則表達式對象。 * **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的正則表達式,或者是預編譯的正則表達式對象。通常在找不到匹配時拋出帶有 message 和code的 ValidationError異常。這一標準行為可以通過設置inverse_match 為True來反轉,這種情況下,如果找到匹配則拋出 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是預編譯的正則表達式,并且覆寫了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ā)布,轉載請保留作者署名和文章出處。
Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。