django中form的自定義校驗
阿新 • • 發佈:2019-01-26
最近要給學校的郵件寫個註冊模組,好讓已經畢業的學生繼續使用學校的郵箱。
在寫表單驗證的時候出現個問題,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