驗證器
編寫驗證器
驗證器是一個可調用的對象,它接受一個值,并在不符合一些規則時抛出
ValidationError
異常。驗證器有助于在不同類型的字段之間重複使用驗證邏輯。
例如,這個驗證器隻允許偶數:
from django.core.exceptions import ValidationError
def validate_even(value):
if value % 2 != 0:
raise ValidationError('%s is not an even number' % 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__()
方法確定它可以
被遷移架構序列化。
驗證器如何運作
關于驗證器如何在表單中運作,詳見
表單驗證。關于它們如何在模型中運作,詳見
驗證對象。要注意驗證器不會在你儲存模型時自動運作,但是如果你使用
ModelForm
,它會在任何你表單包含的字段上運作你的驗證器。關于模型驗證器如何和表單互動,詳見
ModelForm 文檔内建的驗證器
django.core.validators
子產品包含了一系列的可調用驗證器,用于模型和表單字段。它們在内部使用,但是也可以用在你自己的字段上。它們可以用在
field.clean()
方法之外,或者代替它。
RegexValidator
class
RegexValidator
([regex=None, message=None, code=None, inverse_match=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
編譯正規表達式字元串
regex
時所用的辨別。如果
regex
是預編譯的正規表達式,并且覆寫了
flags
,會産生
TypeError
異常。預設為 0。
EmailValidator
EmailValidator
([message=None, code=None, whitelist=None])
* **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']
。其它不包含點符号的域名不能通過驗證,是以你需要按需将它們添加進白名單。
URLValidator
URLValidator
([schemes=None, regex=None, message=None, code=None])
RegexValidator
確定一個值看起來像是URL,并且如果不是的話産生
'invalid'
錯誤代碼。
回送位址以及保留的IP空間被視為有效。同時也支援字面的IPv6位址 (
RFC 2732) 以及unicode域名。
除了父類
RegexValidator
的可選參數之外,
URLValidator
接受一個額外的可選屬性:
schemes
需要驗證的URL/URI模式清單。如果沒有提供,預設為
['http', 'https', 'ftp', 'ftps']
。IANA 網站提供了
有效的URI模式的完整清單作為參考。
Changed in Django 1.7:
添加了可選的
schemes
屬性。
Changed in Django 1.8:
添加了對IPv6 位址, unicode 域名, 以及含有驗證資訊的URL的支援。
validate_email
validate_email
一個不帶有任何自定義的
EmailValidator
執行個體。
validate_slug
validate_slug
一個
RegexValidator
執行個體,確定值隻含有字母、數字、下劃線和連字元。
validate_ipv4_address
validate_ipv4_address
一個
RegexValidator
的執行個體,確定值是IPv4位址。
validate_ipv6_address
validate_ipv6_address
使用
django.utils.ipv6
來檢查是否是 IPv6 位址。
validate_ipv46_address
validate_ipv46_address
validate_ipv4_address
validate_ipv6_address
值是有效的 IPv4 或 IPv6 位址。
validate_comma_separated_integer_list
validate_comma_separated_integer_list
RegexValidator
的執行個體,確定值是整數的逗号分隔清單。
MaxValueValidator
MaxValueValidator
(max_value, message=None)
如果
value
大于
max_value
,抛出帶有
'max_value'
代碼的
ValidationError
異常。
添加了
message
參數。
MinValueValidator
MinValueValidator
(min_value, message=None)
value
小于
min_value
'min_value'
ValidationError
message
MaxLengthValidator
MaxLengthValidator
(max_length, message=None)
value
的長度大于
max_length
'max_length'
ValidationError
message
MinLengthValidator
MinLengthValidator
(min_length, message=None)
value
的長度小于
min_length
'min_length'
ValidationError
message
譯者: Django 文檔協作翻譯小組 ,原文: Data validation 本文以 CC BY-NC-SA 3.0 協定釋出,轉載請保留作者署名和文章出處。 人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。