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

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

class UserWalletAccount(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='wallet', verbose_name='會員ID') credit_amount = models.DecimalField(max_digits=12, decimal_places=2, verbose_name='充值餘額', default=0.0, validators=[MinValueValidator(0)]) present_amount = models.DecimalField(max_digits=12, decimal_places=2, verbose_name='贈送餘額', default=0.0, validators=[MinValueValidator(0)]) frozen_amount = models.DecimalField(max_digits=12, decimal_places=2, verbose_name='凍結餘額', default=0.0, validators=[MinValueValidator(0)])

 

驗證器

編寫驗證器

驗證器是一個可調用的對象,它接受一個值,並在不符合一些規則時拋出ValidationError異常。驗證器有助於在不一樣類型的字段之間重複使用驗證邏輯。html

例如,這個驗證器只容許偶數:python

from django.core.exceptions import ValidationError def validate_even(value): if value % 2 != 0: raise ValidationError('%s is not an even number' % value) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

你能夠經過字段的validators參數將它添加到模型字段中:git

from django.db import models  class MyModel(models.Model): even_field = models.IntegerField(validators=[validate_even]) 
  • 1
  • 2
  • 3
  • 4
  • 5

因爲值在驗證器運行以前會轉化爲Python,你能夠在表單上使用相同的驗證器:正則表達式

from django import forms  class MyForm(forms.Form): even_field = forms.IntegerField(validators=[validate_even]) 
  • 1
  • 2
  • 3
  • 4
  • 5

你也可使用帶有 __call__()方法的類,來實現更復雜或可配置的驗證器。例如,RegexValidator就用了這種技巧。若是一個基於類的驗證器用於validators模型字段的選項,你應該經過添加deconstruct() 和__eq__() 方法確保它能夠被遷移框架序列化django

驗證器如何運行

關於驗證器如何在表單中運行,詳見表單驗證 。關於它們如何在模型中運行,詳見 驗證對象。要注意驗證器不會在你保存模型時自動運行,可是若是你使用ModelForm,它會在任何你表單包含的字段上運行你的驗證器。關於模型驗證器如何和表單交互,詳見ModelForm 文檔markdown

內建的驗證器

django.core.validators模塊包含了一系列的可調用驗證器,用於模型和表單字段。它們在內部使用,可是也能夠用在你本身的字段上。它們能夠用在field.clean() 方法以外,或者代替它。框架

RegexValidator

class RegexValidator([regex=Nonemessage=Nonecode=Noneinverse_match=Noneflags=0])[source]dom

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_matchTrue來反轉,這種狀況下,若是找到匹配則拋出 ValidationError異常。一般它會匹配任何字符串(包括空字符串)。spa

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,會產生TypeError異常。默認爲 0

EmailValidator

class EmailValidator([message=Nonecode=Nonewhitelist=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']。其它不包含點符號的域名不能經過驗證,因此你須要按需將它們添加進白名單。

URLValidator

class URLValidator([schemes=Noneregex=Nonemessage=Nonecode=None])[source]

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[source]

使用django.utils.ipv6 來檢查是不是 IPv6 地址。

validate_ipv46_address

validate_ipv46_address[source]

使用validate_ipv4_address 和 validate_ipv6_address 值是有效的 IPv4 或 IPv6 地址。

validate_comma_separated_integer_list

validate_comma_separated_integer_list

一個RegexValidator的實例,確保值是整數的逗號分隔列表。

MaxValueValidator

class MaxValueValidator(max_valuemessage=None)[source]

若是value 大於 max_value,拋出帶有'max_value'代碼的ValidationError 異常。

Changed in Django 1.8:

添加了message參數。

MinValueValidator

class MinValueValidator(min_valuemessage=None)[source]

若是value小於min_value,拋出帶有'min_value'代碼的ValidationError異常。

Changed in Django 1.8:

添加了message 參數。

MaxLengthValidator

class MaxLengthValidator(max_lengthmessage=None)[source]

若是value的長度大於max_length,拋出帶有'max_length'代碼的ValidationError 異常。

Changed in Django 1.8:

添加了message參數。

MinLengthValidator

class MinLengthValidator(min_lengthmessage=None)[source]

若是value的長度小於min_length,拋出帶有'min_length'代碼的ValidationError異常。

Changed in Django 1.8:

添加了message 參數。

相關文章
相關標籤/搜索