Django学习笔记—ModelForm自定义ValidationError进行表单验证即给model字段添加限制条件

  • Post author:
  • Post category:其他



ValidationError文档

model

class UserAsk(models.Model):
    name = models.CharField(max_length=20,verbose_name=u"用户名")
    mobile = models.CharField(max_length=11,verbose_name=u"手机号码")
    course_name = models.CharField(max_length=50,verbose_name=u"课程名")
    add_time = models.DateTimeField(default=datetime.now)

modelform

import re
from django import forms
from operation.models import UserAsk
class UserAskForm(forms.ModelForm):
    class Meta:
        model = UserAsk
        exclude = ['add_time']

    def clean_mobile(self):
        mobile = self.cleaned_data.get('mobile')
        if re.match(r'^(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}$',mobile):
            return mobile
        else:
            raise forms.ValidationError(u"手机号码非法",code='mobile invalid')

views  (Ajax提交就不写了,和前面的blog一样)

from django.views.generic import View
class AddUserAskView(View):
    def post(self,request):
        ret = {'status': True, 'error': None, 'data': None}
        userAsk_form = UserAskForm(request.POST)
        if userAsk_form.is_valid():
            userAsk_form.save()
            ret['data'] = "您的咨询已收到,我们会马上与您联系"
            return HttpResponse(json.dumps(ret))
        else:
            print(userAsk_form.errors.as_json())
            ret['error'] = userAsk_form.errors['mobile'][0]
            ret['status'] = False
            return HttpResponse(json.dumps(ret))

前端页面


然后验证。因为我在ModelForm中定义了clean_mobile(名字必须这个),那么我下面填写的 1111111 modelform就验证不通过,useAsk_form.is_valid() ==False。所以前端返回“输入格式错误”。debug中也能看到定义的错误。



如果mobile这项什么都不填写,不会进入clean_mobile逻辑,出现的错误是


如果你填写超过了model字段定义的11个字符,那么就会报长度溢出的错误。


综上,clean_mobile方法的验证器是在执行is_valid()方法时,当用户填写的值符合model在定义mobile字段时的限制条件才会触发。如果不符合(比如这里填写的值长度超过11个),那么就不会进入clean_mobile逻辑,这样errors中要么是

输入格式错误

, 要么是

输入字符过长

的错误



版权声明:本文为qq_34964399原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。