# 驗證器
## 編寫驗證器
驗證器是一個可調用的對象,它接受一個值,并在不符合一些規則時拋出[`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.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`](models/fields.html#django.db.models.Field.validators "django.db.models.Field.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`](#django.core.validators.RegexValidator "django.core.validators.RegexValidator")就用了這種技巧。如果一個基于類的驗證器用于[`validators`](models/fields.html#django.db.models.Field.validators "django.db.models.Field.validators")模型字段的選項,你應該通過添加[_deconstruct()_](../topics/migrations.html#custom-deconstruct-method) 和`__eq__()` 方法確保它可以[_被遷移框架序列化_](../topics/migrations.html#migration-serializing)。
## 驗證器如何運行
關于驗證器如何在表單中運行,詳見[_表單驗證_](forms/validation.html) 。關于它們如何在模型中運行,詳見 [_驗證對象_](models/instances.html#validating-objects)。要注意驗證器不會在你保存模型時自動運行,但是如果你使用[`ModelForm`](../topics/forms/modelforms.html#django.forms.ModelForm "django.forms.ModelForm"),它會在任何你表單包含的字段上運行你的驗證器。關于模型驗證器如何和表單交互,詳見[_ModelForm 文檔_](../topics/forms/modelforms.html)。
## 內建的驗證器
[`django.core.validators`](#module-django.core.validators "django.core.validators: Validation utilities and base classes")模塊包含了一系列的可調用驗證器,用于模型和表單字段。它們在內部使用,但是也可以用在你自己的字段上。它們可以用在`field.clean()` 方法之外,或者代替它。
### RegexValidator
_class _`RegexValidator`([_regex=None_, _message=None_, _code=None_, _inverse_match=None_, _flags=0_])[[source]](../_modules/django/core/validators.html#RegexValidator)
<table class="docutils field-list" frame="void" rules="none"><colgroup><col class="field-name"><col class="field-body"></colgroup><tbody valign="top"><tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body">* **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) 異常。
</td></tr></tbody></table>
`regex`
用于搜索提供的`value`的正則表達式,或者是預編譯的正則表達式對象。通常在找不到匹配時拋出帶有 [`message`](#django.core.validators.RegexValidator.message "django.core.validators.RegexValidator.message") 和[`code`](#django.core.validators.RegexValidator.code "django.core.validators.RegexValidator.code")的 [`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError")異常。這一標準行為可以通過設置[`inverse_match`](#django.core.validators.RegexValidator.inverse_match "django.core.validators.RegexValidator.inverse_match") 為`True`來反轉,這種情況下,如果**找到**匹配則拋出 [`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError")異常。通常它會匹配任何字符串(包括空字符串)。
`message`
驗證失敗時[`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError")所使用的錯誤信息。默認為`"Enter a valid value"`。
`code`
驗證失敗時[`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError")所使用的錯誤代碼。默認為`"invalid"`。
`inverse_match`
New in Django 1.7\.
[`regex`](#django.core.validators.RegexValidator.regex "django.core.validators.RegexValidator.regex")的匹配模式。默認為`False`。
`flags`
New in Django 1.7\.
編譯正則表達式字符串[`regex`](#django.core.validators.RegexValidator.regex "django.core.validators.RegexValidator.regex")時所用的標識。如果[`regex`](#django.core.validators.RegexValidator.regex "django.core.validators.RegexValidator.regex")是預編譯的正則表達式,并且覆寫了[`flags`](#django.core.validators.RegexValidator.flags "django.core.validators.RegexValidator.flags"),會產生[`TypeError`](https://docs.python.org/3/library/exceptions.html#TypeError)異常。默認為 <cite>0</cite>。
### EmailValidator
_class _`EmailValidator`([_message=None_, _code=None_, _whitelist=None_])[[source]](../_modules/django/core/validators.html#EmailValidator)
<table class="docutils field-list" frame="void" rules="none"><colgroup><col class="field-name"><col class="field-body"></colgroup><tbody valign="top"><tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body">* **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")。
</td></tr></tbody></table>
`message`
驗證失敗時[`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError")所使用的錯誤信息。默認為`"Enter a valid email address"`。
`code`
驗證失敗時[`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError")所使用的錯誤代碼。默認為`"invalid"`。
`whitelist`
所允許的郵件域名的白名單。通常,正則表達式(`domain_regex` 屬性) 用于驗證 @ 符號后面的任何東西。但是,如果這個字符串在白名單里,就可以通過驗證。如果沒有提供,默認的白名單是 `['localhost']`。其它不包含點符號的域名不能通過驗證,所以你需要按需將它們添加進白名單。
### URLValidator
_class _`URLValidator`([_schemes=None_, _regex=None_, _message=None_, _code=None_])[[source]](../_modules/django/core/validators.html#URLValidator)
[`RegexValidator`](#django.core.validators.RegexValidator "django.core.validators.RegexValidator")確保一個值看起來像是URL,并且如果不是的話產生`'invalid'`錯誤代碼。
回送地址以及保留的IP空間被視為有效。同時也支持字面的IPv6地址 ([**RFC 2732**](http://tools.ietf.org/html/rfc2732.html)) 以及unicode域名。
除了父類[`RegexValidator`](#django.core.validators.RegexValidator "django.core.validators.RegexValidator")的可選參數之外,`URLValidator`接受一個額外的可選屬性:
`schemes`
需要驗證的URL/URI模式列表。如果沒有提供,默認為 `['http', 'https', 'ftp', 'ftps']`。IANA 網站提供了 [有效的URI模式](https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml)的完整列表作為參考。
Changed in Django 1.7:
添加了可選的`schemes` 屬性。
Changed in Django 1.8:
添加了對IPv6 地址, unicode 域名, 以及含有驗證信息的URL的支持。
### validate_email
`validate_email`
一個不帶有任何自定義的[`EmailValidator`](#django.core.validators.EmailValidator "django.core.validators.EmailValidator")實例。
### validate_slug
`validate_slug`
一個 [`RegexValidator`](#django.core.validators.RegexValidator "django.core.validators.RegexValidator")實例,確保值只含有字母、數字、下劃線和連字符。
### validate_ipv4_address
`validate_ipv4_address`
一個[`RegexValidator`](#django.core.validators.RegexValidator "django.core.validators.RegexValidator")的實例,確保值是IPv4地址。
### validate_ipv6_address
`validate_ipv6_address`[[source]](../_modules/django/core/validators.html#validate_ipv6_address)
使用`django.utils.ipv6` 來檢查是否是 IPv6 地址。
### validate_ipv46_address
`validate_ipv46_address`[[source]](../_modules/django/core/validators.html#validate_ipv46_address)
使用`validate_ipv4_address` 和 `validate_ipv6_address` 值是有效的 IPv4 或 IPv6 地址。
### validate_comma_separated_integer_list
`validate_comma_separated_integer_list`
一個[`RegexValidator`](#django.core.validators.RegexValidator "django.core.validators.RegexValidator")的實例,確保值是整數的逗號分隔列表。
### MaxValueValidator
_class _`MaxValueValidator`(_max_value_, _message=None_)[[source]](../_modules/django/core/validators.html#MaxValueValidator)
如果`value` 大于 `max_value`,拋出帶有`'max_value'`代碼的[`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError") 異常。
Changed in Django 1.8:
添加了`message`參數。
### MinValueValidator
_class _`MinValueValidator`(_min_value_, _message=None_)[[source]](../_modules/django/core/validators.html#MinValueValidator)
如果`value`小于`min_value`,拋出帶有`'min_value'`代碼的[`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError")異常。
Changed in Django 1.8:
添加了`message` 參數。
### MaxLengthValidator
_class _`MaxLengthValidator`(_max_length_, _message=None_)[[source]](../_modules/django/core/validators.html#MaxLengthValidator)
如果`value`的長度大于`max_length`,拋出帶有`'max_length'`代碼的[`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError") 異常。
Changed in Django 1.8:
添加了`message`參數。
### MinLengthValidator
_class _`MinLengthValidator`(_min_length_, _message=None_)[[source]](../_modules/django/core/validators.html#MinLengthValidator)
如果`value`的長度小于`min_length`,拋出帶有`'min_length'`代碼的[`ValidationError`](exceptions.html#django.core.exceptions.ValidationError "django.core.exceptions.ValidationError")異常。
Changed in Django 1.8:
添加了`message` 參數。
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[Data validation](https://docs.djangoproject.com/en/1.8/ref/validators/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 協議發布,轉載請保留作者署名和文章出處。
>
> [Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html)人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架