Django Validators - WBowam/wbowam.github.com GitHub Wiki

Date: 2014-09-07
Title: Django Validators Tags: Django
Category: It

之前没用过Validators
这回入了门,用了一下,很爽~~


Django Validators

正如django文档所说:我们可以自己新建各种Validators,如:
from django.core.exceptions import ValidationError

def validate_even(value):
    if value % 2 != 0:
        raise ValidationError('%s is not an even number' % value)

You can add this to a model field via the field’s validators argument:

from django.db import models

class MyModel(models.Model):
    even_field = models.IntegerField(validators=[validate_even])

神奇点在于,django自动帮我们抓取‘值’当作参数传入我们的Validators(有点像让人讨厌的黑魔术,但不是~~)

同一个Validators也可以用于form,因为model和form相应的机理是一样的
from django import forms

class MyForm(forms.Form):
    even_field = forms.IntegerField(validators=[validate_even])

不过,多数时候我们喜欢用内置的Validators,也就是官网说的Built-in validators

用法如下:

from django.core.validators import MinLengthValidator
from django.db import models

class MyModel(models.Model):
    even_field = models.TextField(validators=[MinLengthValidator(20)])

以上所用MinLengthValidator网名生意:max_length的反意思。
还有很多内置Validator,看官网

假如我想改一下内置 Validator的错误提示,可以这么干:

1.自己写一个子类,覆盖message

from django.core.validators import MinLengthValidator
from django.db import models

class MyMinLengthValidator(MinLengthValidator):
    message = "少年, 至少输入%(limit_value)d个字符 ,(你怎么只输入 %(show_value)d个字符就完事儿啊)."

class MyModel(models.Model):
    even_field = models.TextField(validators=[MinLengthValidator(20)])
  1. 当然,这种方法很简单,很常见,不够高大上:填写error_messages 选项
....
my_field = forms.CharField(validators=[MinLengthValidator(8)],
                           error_messages={"min_length":"少年, 至少输入%(limit_value)d个字符 ,(你怎么只输入 %(show_value)d个字符就完事儿啊)."})
})
..  . ..
⚠️ **GitHub.com Fallback** ⚠️