django中form的自定义校验

来源:互联网 发布:docker oracle数据库 编辑:程序博客网 时间:2024/04/30 08:52


最近要给学校的邮件写个注册模块,好让已经毕业的学生继续使用学校的邮箱。

在写表单验证的时候出现个问题,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 modelsclass 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 formsclass 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


原创粉丝点击