Django的Form验证
Django的Form验证
Form验证:Form提交Form表单数据验证
- 针对Form提交的数据进行验证 - 创建模板 class loginForm()
- 请求提交给模板,创建对象 obj=loginForm(request.POST)
- 进行验证 obj.is_valid
- 获取正确信息 obj.clean()
- 获取错误信息 obj.errors
 
- 后端返回给前端错误信息 - 刷新页面,模板对象内容值丰富(参数),(点击提交)刷新页面后值和报错信息都有 
- 后端自动在前端生成html,保留前端信息 - 自动生成html标签
- 保留上一次提交的数据
 - 注:测试时,要打开控制台修改自动生成的邮箱input的type="text"(修改掉高级浏览器的cream) - <!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="UTF-8">
 <title>Title</title>
 </head>
 <body>
 <h1>Django的Form表单验证</h1>
 <form action="/login/" method="post">
 <!-- 自动生成Html标签,并记录上一次输入的值 -->
 <p>用户ID:{{ oo.userID }}
 <span>{{ oo.errors.userID.0 }}</span></p>
 <p>email:{{ oo.userEmail }}
 <span>{{ oo.errors.userEmail.0 }}</span></p>
 <p>密码:<input type="text"></p>
 <!-- 动态数据生成
 <p>用户ID:<input type="text" name="userID" placeholder="请输入用户ID">
 <span>{{ oo.errors.userID.0 }}</span></p>
 <p>email:<input type="text" name="userEmail" placeholder="请输入邮箱地址">
 <span>{{ oo.errors.userEmail.0 }}</span></p>
 <p>密码:<input type="text"></p> -->
 <p><input type="submit" value="提交"></p>
 </form>
 </body>
 </html>
 - from django.shortcuts import render,redirect
 from django import forms
 from django.forms.utils import ErrorList
 # Create your views here.
 class loginForm(forms.Form):
 userID = forms.CharField(min_length=6,error_messages={"required":"用户ID不能为空",
 "min_length":"用户名长度不能小于6"})
 userEmail = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"})
 def login(request):
 if request.method == "GET":
 obj = loginForm() #默认GET,就不需要添加request.Post参数
 #obj = loginForm({"userID":456,"userEmail":789}) #记录的上一次输入的值
 return render(request,"login.html",{'oo':obj})
 elif request.method == "POST":
 obj = loginForm(request.POST)
 status = obj.is_valid()
 print(status)
 if status:
 pad = obj.clean()
 print(pad)
 else:
 #error_obj = obj.errors.as_json() #字典形式输出(默认是ul li形式输出)
 #error_obj = obj.errors #ul li形式输出
 # print(error_obj)
 # print(error_obj['userID'],type(error_obj['userID']))
 # print(error_obj['userID'][0],type(error_obj['userID'][0]))
 # print(error_obj['userEmail'],type(error_obj['userEmail']))
 # print(error_obj['userEmail'][0],type(error_obj['userEmail'][0]))
 print(obj.errors['userID'][0], type(obj.errors['userID'][0]))
 print(obj.errors['userEmail'][0], type(obj.errors['userEmail'][0]))
 return render(request,"login.html",{'oo':obj})
  
Form验证:Ajax提交Form表单数据验证
- 针对提交数据进行验证
- 错误信息处理
- 两次反序列化:obj.errors.as_json() 默认数据类型str(字符串)
- 一次反序列化:obj.errors.as_data() 默认数据类型dict(字典)
 
注:isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
1.isinstance()与type()区别:
- type()不会认为子类是一种父类类型不考虑继承关系。 
- isinstance()会认为子类是一种父类类型,考虑继承关系。 - 判段两个类型是否相同时要清楚是否需要考虑继承关系,不考虑继承就用type()判断,需要考虑就用isinstance()判断。 
2.ValidationError类型的数据在python中不支持json.dumps()序列化,所以需要自定义序列化类型创建cls=...
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/jquery-2.1.4.min.js"></script>
    <style>
    .error-msg{
        color: red;
        font-size: 12px;
    }
    </style>
</head>
<body>
<h1>Django的Form表单验证</h1>
<form id="act">
    <p>用户ID:<input type="text" name="userID" placeholder="请输入用户ID">
    </p>
    <p>email:<input type="text" name="userEmail" placeholder="请输入邮箱地址">
    </p>
    <p>密码:<input type="text"></p>
    <input type="button" id="ajax_button" value="提交">
</form>
<script>
    $(function(){
        $("#ajax_button").click(function(){
            //var userID = $('form input[name="userID"]').val();
            //var userEmail = $('form input[name="userEmail"]').val();
            //var act = $("#act").serialize();
            //console.log(userID,userEmail,act);
            $.ajax({
                url:"/logins/",
                type:"POST",
                data:$('#act').serialize(),
                success:function(arg){
                    $('.error-msg').remove();
                    var v1 = JSON.parse(arg);
                    console.log(v1);
                    if(v1.status){
                        var  error_obj = v1.error;
                        $.each(error_obj,function(k,v){
                             // k: user 或 email
                            // v: [{}{}{},]
                            var tag = document.createElement('span');
                            tag.className = 'error-msg';
                            tag.innerHTML = v[0].message;
                            $("input[name='"+k+"']").after(tag);
                        })
                    }else{
                        location.href = "/logins/"
                    }
                }
            })
        });
    });
</script>
<!--注:$.each(data,function(k,v){})这个方法是jQuery的通用遍历方法,它可以遍历数组、json对象以及dom元
素。遍历数组时,回调函数的第一个参数为遍历的下标,第二个为遍历的值,记作$.each(data,function(i,v){});-->
</body>
</html>
import json
class loginForm(forms.Form):
    userID = forms.CharField(min_length=6,error_messages={"required":"用户ID不能为空",
                                                          "min_length":"用户名长度不能小于6"})
    userEmail = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"})
def logins(request):
    if request.method == "GET":
        return render(request,"logins.html")
    elif request.method == "POST":
        ret = {"status":True,"error":None,"data":None}
        obj = loginForm(request.POST)
        if obj.is_valid():
            print(obj.clean())
        else:
            #两次反序列化
            # ret_str = obj.errors.as_json() #ret_str是一个字符串
            # ret["status"] = False
            # ret["error"] = ret_str
            #一次反序列化
            ret["status"] = False
            ret["error"] = obj.errors.as_data() #字典类型
            #print(type(obj.errors.as_data()))
            print(ret["error"])
            #{'userID': [ValidationError(['用户名长度不能小于6'])], 'userEmail': [ValidationError(['邮箱格式错误'])]}
            print(ret["error"]['userID'])
            #[ValidationError(['用户名长度不能小于6'])]
        return HttpResponse(json.dumps(ret,cls=JsonCustomEncoder))
from django.core.validators import ValidationError
class JsonCustomEncoder(json.JSONEncoder):
    def default(self,field):
        if isinstance(field,ValidationError): #判断是否为相同类型
            return {'code':field.code,'message':field.message}
        else:
            return json.JSONEncoder.default(self,field)

Django的Form验证的更多相关文章
- Django的Form验证(2)
		Django的Form验证(2) Form的含义及作用: 用于验证用户请求数据合法性的一个组件(校验数据的合法性) Django的Form实现步骤: 创建一个验证用户请求的模板 from django ... 
- Django中Form验证
		Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一,Form验证 第一种操作:主要是这三个函数 ... 
- django 使用form验证用户名和密码
		form验证可以减少查询数据库,所以代码先预先验证,有问题可以返回给前端显示 1.在users文件夹下新建forms.py文件,用来验证用户名和密码是否为空,密码长度是否大于6 # -*- codin ... 
- django的form验证机制
		今天遇到了一个奇怪的问题,django中formview一直返回200,但是却没有执行form_valid方法,然后在其中加了一个form_invalid方法: class StudentRegist ... 
- Django之Form验证
		view.py 配置 from django import forms from django.forms import fields # Create your views here. class ... 
- Python  Django的分页,Form验证,中间件
		本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ... 
- Django form验证
		# 模版 class LoginForm(forms.Form): # 模版中的元素 user = forms.CharField(min_length=6,error_messages={" ... 
- [py][mx]django form验证-给db减压
		django form认证-解压db压力 一般系统都需要前后端都验证 前端验证容器逃逸破解,如通过js console口去发 试想如果后端只有db验证,那么前端无论发什么后端都查询一次db,对db压力 ... 
- Django 博客项目02 Form验证+ 上传头像(预览)+Ajax用户注册
		头像预览 $("#avatar_file").change(function(){ // 获取上传的文件对象 var file=$(this)[0].files[0]; // 读取 ... 
随机推荐
- SpringMVC 请求参数绑定
			什么是请求参数绑定 请求参数格式 默认是key/value格式,比如:http:xxxx?id=1&type=2 请求参数值的数据类型 都是字符串类型的各种值 请求参数值要绑定的目标类型 Co ... 
- Linux中shell基础、重定向、管道符、环境变量
			1.什么是shell Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器).它接收用户输入的命令并把它送入内核去执行.起着协调用户与系统的一致性和在用户与系统之间进行交互的 ... 
- 【JavaEE】之MyBatis与原生JDBC、Hibernate访问数据库的比较
			首先来看一下原生JDBC访问数据库的代码: public static void main(String[] args) { // 数据库连接 Connection connection = null ... 
- Django中间件部分源码分析
			中间件源码分析 中间件简介 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的 ... 
- gganimate|创建可视化动图,让你的图表会说话
			本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/kKQ2670FBiDqVCMuLBL9NQ 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. ... 
- MySql简单的增删改查语句 js
			最近在项目中需要连接数据库,做增删改查的功能,sql语句整理做了以下记录(基于NodeJs,注:data为你的真实数据): (一)新增插入表中数据: sql: 'insert into work(表名 ... 
- 链式栈-C语言实现
			相对于顺序栈的空间有限,链式栈的操作则更加灵活 #include<stdio.h> #include<malloc.h> typedef int SElemType; //元素 ... 
- 转:Spring事务管理
			spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.Tran ... 
- Redis 中的数据库
			前面我们花了很多的时间介绍了 redis 中基本的数据结构,及其内部的实现情况,这些都是非常基础的东西,可能不经意间你就会用到他们,希望你花点时间了解一下. 接下来,我们将走近 redis 数据库,学 ... 
- 洛谷 题解 P3173 【[HAOI2009]巧克力】
			本蒟蒻又双叒叕被爆踩辣! 又是一道经典的贪心题: 那么怎样切割该块巧克力,花费的代价最少呢? Solution: 窝们考虑每个状态,有多少种选择方法? 是不是可以选择横着切或者竖着切,就这两种方法吧: ... 
