表单中常用的验证器及自定义验证

在验证某个字段时,我们可以传递一个validators(需引入from django.core import validators)参数来指定验证器,进一步对数据进行过滤。常用的验证器有如下:

  1. MaxValuValidator:验证最大值。
  2. MinValuValidator:验证最小值。
  3. MinLengthValidator:验证最小长度。
  4. MaxLengthValidator:验证最大长度。
  5. EmailValidator:验证是否是邮箱格式。
  6. URLValidator:验证是否是url格式。
  7. 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。如果验证失败,就抛出一个错误验证。

  1. 首先我们先创建一个模型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 不唯一的
  2. 然后定义一个注册的视图函数:
    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('注册失败')
  3. 在表单 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开头加上该字段的名字,就会专门对改字段再进行一次更深的验证方法

猜你喜欢

转载自www.cnblogs.com/nihao2/p/12283977.html