天天看點

django 1.8 官方文檔翻譯:13-12 驗證器驗證器

驗證器

編寫驗證器

驗證器是一個可調用的對象,它接受一個值,并在不符合一些規則時抛出

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。