表单中常用的验证器,自定义验证,以及简化表单错误信息的提取
在验证某个字段时,我们可以传递一个validators(需引入from django.core import validators)参数来指定验证器,进一步对数据进行过滤。常用的验证器有如下:
- MaxValuValidator:验证最大值。
- MinValuValidator:验证最小值。
- MinLengthValidator:验证最小长度。
- MaxLengthValidator:验证最大长度。
- EmailValidator:验证是否是邮箱格式。
- URLValidator:验证是否是url格式。
- RegexValidator:写正则匹配来验证字段,如电话号等。。
新建forms.py 定义表单验证格式,
from django import forms from django.core import validators class MyForm(forms.Form): telephone = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}',message='输入正确的手机格式。')])
在views视图中写:
from django.shortcuts import render from django.views.generic import View from .forms import MyForm class IndexView(View): def get(self,request): return render(request,'index.html') def post(self,request): form = MyForm(request.POST) if form.is_valid(): form = form.cleaned_data.get('telephone') return HttpResponse('success') else: print(form.errors.get_json_data) return HttpResponse('shibai')
自定义验证:
有时候我们会需要验证一个的字段不是一个长度,一个正则表达式能够写清楚的,需要增加一些逻辑,django提供了自定义的验证,比如注册表单时要验证手机号是否已经被注册过了,两次密码是否一致等等。。。这个名字的定义规则时:clean_fieldname。如果验证失败,就抛出一个错误验证。
- 首先我们先创建一个模型models。定义我们的字段(将字段放到我们的数据库中)
from django.db import models # Create your models here. class User(models.Model): username = models.CharField(max_length=100) telephone = models.CharField(max_length=11,unique=True) #注意写unique 不唯一的
- 然后定义一个注册的视图函数:
class RegisterView(View): def get(self,request): return render(request,'register.html') def post(self,request): form = RegisterForm(request.POST) if form.is_valid(): username = form.cleaned_data.get('username') telephone = form.cleaned_data.get('telephone') user = User.objects.create(username=username,telephone=telephone) #create方法 将网页上传入的添加到数据库中。 return HttpResponse('success') else: print(form.errors.get_json_data()) #获取错误信息,以字典类型打印出来。 return HttpResponse('注册失败')
- 在表单 forms.py 中写
class RegisterForm(forms.Form): username=forms.CharField(max_length=100) telephone = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}',message='请规范输入')]) pwd1=forms.CharField(max_length=16,min_length=6) pwd2=forms.CharField(max_length=16,min_length=6) def clean_telephone(self): #以clean开头加上该字段的名字,就会专门对改字段再进行一次更深的验证方法 telephone = self.cleaned_data.get('telephone') #获取手机号码 exists = User.objects.filter(telephone=telephone).exists() #exist()查看该字段是否存在否存在 if exists: raise forms.ValidationError(message='{}手机号已经被注册'.format(telephone)) #如果验证没有问题 ,一定要将telephone返回。 return telephone def clean(self): #如果来到了clean方法说明之前的每一个字段都验证成功了 cleaned_data = super().clean() pwd1 = cleaned_data.get('pwd1') pwd2 = cleaned_data.get('pwd2') if pwd1 != pwd2: raise forms.ValidationError(message='两次不一致') return cleaned_data
注:以clean开头加上该字段的名字,就会专门对改字段再进行一次更深的验证方法
简化表单错误信息的提取:
如果验证器验证失败的话我们要把信息返回给前端,就需要一些方法来将其提取出来:
- form.errors:这个属性获取的错误信息是一个包含了html标签的错误信息。
- form.errors.get_json_data():这个方法取到的是一个字典类型的错误信息。将每个字段的名字作为key
- form.as_json():这个方法是将form.get_json_data()返回的字典dump 成 json格式的字符串,方便进行输出。
上述方法返回的都是一些比较复杂的代码,不方便前端的查看。我们要简化错误信息的提取,可以定义一个类方法,然后写视图函数,这样如果多个表单都需要调用该方法,只需要继承我们所写的方法就可以了。
class BaseForm(forms.Form): #多个表单的话直接继承这个表单 def get_errors(self): # 在任何表单都可以使用 errors = self.errors.get_json_data() #这个方法会获取到以字典类型的错误信息,不便于查看。 new_errors = {} for key, message_dicts in errors.items(): #将错误信息的键和值全部遍历出来。 message = [] for message_dict in message_dicts: #错误信息的值遍历出来 messages = message_dict['message'] #过滤掉不需要的多余信息。 message.append(messages) #这个就是错误信息的值 value new_errors[key] = message #这个就是简化错误信息的key
return new_errors #这样我们返回的就是简单错误信息,前端就可以直接调用了。
调用的话直接form.get_errors()即可。

浙公网安备 33010602011771号