1. 程式人生 > >django中form的自定義校驗

django中form的自定義校驗

最近要給學校的郵件寫個註冊模組,好讓已經畢業的學生繼續使用學校的郵箱。

在寫表單驗證的時候出現個問題,django中form並沒有提供學號型別的field(好吧,我承認哪個框架都不會提供的),但是我還地用總不能向以前那樣在處理資料時做資料校驗吧,於是就翻手冊,找到三個解決方法,一個是自定義field,一個是使用validators,一個是重寫form中和校驗相關的方法。我選擇了第二種,其實三種方法基本上都是一樣的,就是覺得使用validator比較方便。

手冊上有這樣一段內容:


#A validator is a callable that takes a value and raises a 
#ValidationError if it doesn’t meet some criteria. Validators can be useful 
#for re-using validation logic between different types of fields.
#For example, here’s a validator that only allows even numbers:

from django.core.exceptions import ValidationError
    def validate_even(value):
        if value % 2 != 0:
            raise ValidationError(u’%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])

#Because values are converted to Python before validators are run, you can 
#even use the same validator with forms:

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

仿照著手冊寫了一個校驗學號的函式,讓後加入到validators中,但是又遇到一個問題,填寫的資料正確的時候一切都很正常,一旦發生錯誤,就提示沒有返回HttpResponse物件。正常情況下如果驗證失敗django就會跳轉到填寫表單的頁面,並列印錯誤資訊,加上自定義的validators後它就不自動跳轉了,以前我們可以這樣寫一個form的校驗:
def addUser(request):
    if request.method == 'POST':
        f = form(request.POST)#從表單獲取資料
        if f.is_valid():#校驗資料
            pass
    else:
        pass

使用validators後就只能這樣寫了:

def addUser(request):
    if request.method == 'POST':
        f = form(request.POST)#從表單獲取資料
        if f.is_valid():#校驗資料
            pass
        else:
            pass
    else:
        pass