121.自定义验证器

自定义验证器:

有时候我们需要从数据库中提取数据进行验证,这个时候如果还是采用已经定义好的验证器就不能够实现我们想要的功能了。比如我们在注册的时候要验证该手机号或者是邮箱之前是否已经注册过了。如果已经注册过了,就不能够再次进行注册了。这个时候我们就需要对数据库中的手机字段进行验证了。对某个字段进行验证的方式就是,定义一个方法,这个方法的名字的定义规则就是clean_fieldname.如果验证失败,那么就抛出一个错误,如果没有找到相同的手机号就正常情况下返回一个手机号,代表已经通过了验证。

(1)比如,在注册的时候我们需要输入用户名手机号,密码以及确认密码四个字段的内容,同时需要对手机号是否存在数据库中进行判断,并且对密码的长度和两次密码的是否相同进行判断。那么就可以通过以下代码实现:

==forms.py文件中定义form表单字段,并且自定义验证器,示例代码如下:==

from django import forms
from djang.core import validators
from .models import User


class RegisterForm(forms.Form):
    username = forms.CharField(max_length=100,error_messages={'invalid': '输入的username是无效的'})
    # 注意这里定义的验证器参数validators所对应的是列表,一个可以迭代的对象。
    telephone = forms.CharField(validators=[validators.RegexValidator(r"1[345678]\d{9}", message='请输入正确的手机号码')])
    pwd1 = forms.CharField(max_length=24, min_length=6, error_messages={'invalid':'您输入的密码长度不符合要求'})
    pwd2 = forms.CharField(max_length=24, min_length=6, error_messages={'invalid':'您输入的密码长度不符合要求'})
    
    
    
    def clean_telephone(self):
    
        telephone = self.super().cleaned_data.get('telephone')
        
        exists = User.objects.filter(telephone=telephone).exists()
        if exists:
            raise forms.ValidationError('%s您输入的手机号已经注册过了,请确定后再输入。'%telephone)
        return telephone
        
    
    def clean(self):
        clean_data = super().clean()
        pwd1 = clean_data.get('pwd1')
        pwd2 = clean_data.get('pwd2')
        
        if pwd1 != pwd2:
            raise forms.ValidationError('您两次输入的密码不相同,请确认!')
        return clean_data

==在views.py文件定义对应的类视图,示例代码如下:==

from django.views import View
from .forms import RegisterForm
from .models import User
from django.http import HttpResponse
from django.shortcuts import render

class register_view(View):
    
    def get(self, request):
        forms = RegisterForm()
        return render(request, 'register.html',context={'forms':forms})
        
    def post(self, request):
        forms = RegisterForm(request.POST)
        
        if forms.is_valid():
            username = forms.cleaned_data.get('username')
            telephone = forms.cleaned_data.get('telephone')
            pwd1 = forms.cleaned_data.get('pwd1')
            pwd2 = forms.cleaned_data.get('pwd2')
            User.objects.create(username=username, telephone=telephone,pwd1=pwd1, pwd2=pwd2)
            return HttpResponse('Add user successful')
        else
        
            print(forms.errors.get_json_data())
            return HttpResponse('Fail user lose')

==在models.py文件中定义相应的User模型,示例代码如下:==

from django.db import models


class User(models.Model):
    username = models.CharField(max_length=100)
    telephone = models.CharField(max_length=100,unique=True)
    pwd1 = models.CharField(max_length=24)
    pwd2 = models.CharField(max_length=24)

==在APP中的urls.py文件中进行映射:==

from django.urls import path
from .views import Addview, register_view

app_name = 'validator'

urlpatterns = [
    path('', Addview.as_view(), name='add'),
    path('register/', register_view.as_view(), name='register'),
]

==在项目的urls.py文件中进行映射,示例代码如下:==

from django.urls import path, include

urlpatterns = [
    path('front/', include('front.urls')),
    path('validator/', include('validator.urls')),
]

==在register.html中的表单定义如下:==




    
    Title


姓名:
手机号:
密码:
确认密码:

你可能感兴趣的:(121.自定义验证器)