欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django(part46)--form表单验证

程序员文章站 2022-03-07 19:44:55
...

学习笔记,仅供参考




form表单验证


form提供表单和字段验证,我们可以使用form.is_valid() 方法进行表单验证,若该方法返回值为True,则表示当前表单合法,若返回值为False,则说明表单验证出现问题。

注意!这里,以及下面的form指的是forms.Form类的对象。


举个例子


我们基于上一个Blog里的mywebsite_bookstore项目,举一个例子来学习form表单验证。


如果我们没有进行表单验证操作,那么,当我们进行注册时,姓名可以填写任意格式和任意长度的数据,这显然不符合一般的填写要求,且不方便我们处理:

Django(part46)--form表单验证

为了使用户规范的填写注册信息,我们需要进行表单验证,即不按照规范进行信息填写,就注册不成功

在userinfo应用下的views.py模块中,我们对视图函数test_form进行修改,增加一个表单验证功能:

def test_form(request):
    if request.method == "GET":
        myform = forms.RegForm()
        #创建对象
        return render(request, 'userinfo/test_form.html',
                      locals())
    elif request.method == "POST":
        myform = forms.RegForm(request.POST)
        if myform.is_valid():
            #检验表单中数据是否合法
            print(myform.cleaned_data)
            #输出表单类中所有属性值组成的字典
            return HttpResponse("<h2>表单提交成功!</h2> <br>" + str(myform.cleaned_data))
        else:
            return HttpResponse("<h2>表单数据验证失败!</h2>")

注意!若想要myform.is_valid()方法返回True,则需要下面3个条件同时验证成功:

  • forms.xxxField()方法中的参数值进行验证,验证成功返回None,验证失败抛出forms.ValidationError异常
  • form.clean_属性名(self)方法中的属性进行验证,验证成功返回属性值,验证失败抛出forms.ValidationError异常
  • form.clean(self)方法(表单的整体结构)进行验证,验证成功返回 self.cleaned_data,验证失败抛出forms.ValidationError异常

现在,我们编辑forms.py,添加两个方法,进行验证:

# -*- coding: utf-8 -*-
from django import forms

class RegForm(forms.Form):
    username = forms.CharField(label = "输入昵称")
    password = forms.CharField(label = "输入密码",
                               widget=forms.PasswordInput)
    passwordRepeat = forms.CharField(label = "再次输入密码",
                                     widget=forms.PasswordInput)
    tele = forms.CharField(label = "手机号", required = False)
    email = forms.CharField(label = "邮箱", required = False,
                            widget=forms.EmailInput)
    #<input type="text">
    def clean_username(self):
        #对单个属性进行检验
        username = self.cleaned_data["username"]
        if (len(username) < 6) | (len(username) > 12):
            raise forms.ValidationError("用户名必须在6~12个字符之间!")
        return username
    
    def clean(self):
        #属性之间进行检验(整体检验)
        pwd1 = self.cleaned_data["password"]
        pwd2 = self.cleaned_data["passwordRepeat"]
        
        if pwd1 != pwd2:
            raise forms.ValidationError("两次输入不一致!")
        return self.cleaned_data

注意,views.py模块中test_form视图方法里的is_valid()方法会自动调用clean_username函数和clean函数。


我们向http://127.0.0.1:8000/userinfo/test_form/发起请求,并填写符合要求的注册信息:

Django(part46)--form表单验证

点击注册,显示表单提交成功:

Django(part46)--form表单验证

当我们填写的用户名大于12个字符时,再点击注册,Django就会提示我们验证失败:

Django(part46)--form表单验证