最近要给学校的邮件写个注册模块,好让已经毕业的学生继续使用学校的邮箱。
在写表单验证的时候出现个问题,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