Django validators

記得沒錯的話, 應該是從 Django 1.2 開始加入了 validators 這樣的機制, 以往都是透過 django forms 來處理 validation, 得自己寫 form clean validation, 因為從 model 來看, 幾乎是沒有 validation 的機制。 ( 你看 Rails 多好 XD )

所以開發時常常碰的的問題是, 對於同一筆資料會有兩種以上的 form, 像是 CreateForm 及 UpdateForm, 這時候 form clean validation 就得寫兩份, 或是先寫一個來繼承 (? 其實我好像試過是不行的)。

總之, 沒有負責寫 code 好長一陣子了, 最近回去寫 code 時, 發現某專案有很多同樣的 form clean validation 遍佈好幾個地方, 所以才研究了一下 Django validators。

validators 寫法大概像是下面這兩種

from django.core.validators import RegexValidator  
from django.core.exceptions import ValidationError

# case one
validate_password = RegexValidator('^S{3,12}$',  
    _('This password is not valid, should be 3 to 12 characters'))

# case two
def validate_username(value):

    length = len(value)
    if length < 3 or length > 16:
        raise ValidationError(_('3 to 16 characters only, please.'))

接著你就可以直接把 validators 放進 Model Field 或是 Form Field, 這樣一來就輕鬆多了, 像是下面這樣

username = models.CharField(max_length=16, unique=True,  
    validators=[validators.validate_username])

如果都是用 ModelForm 的話, 就完全不用另外寫 validation, 另外, 也可以直接拿到 view 用, 像是這樣, 接著去 catch ValidationError 即可。

    try:
        validators.validate_username(username)
    except ValidationError, e:
        return 'Oops'

不像以往 clean_username 這樣的方式得寫好幾個地方, 當然得看實際情況。 有了 validators 後, 的確是簡化很多麻煩事, 至少 forms.py 不會那麼亂了 XD

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!