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 版权协议,转载请附上原文出处链接和本声明。