Django的Form验证

Form验证:Form提交Form表单数据验证

  • 针对Form提交的数据进行验证

    1. 创建模板 class loginForm()
    2. 请求提交给模板,创建对象 obj=loginForm(request.POST)
    3. 进行验证 obj.is_valid
    4. 获取正确信息 obj.clean()
    5. 获取错误信息 obj.errors
  • 后端返回给前端错误信息

    刷新页面,模板对象内容值丰富(参数),(点击提交)刷新页面后值和报错信息都有

  • 后端自动在前端生成html,保留前端信息

    1. 自动生成html标签
    2. 保留上一次提交的数据

    注:测试时,要打开控制台修改自动生成的邮箱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表单数据验证

  • 针对提交数据进行验证
  • 错误信息处理
    1. 两次反序列化:obj.errors.as_json() 默认数据类型str(字符串)
    2. 一次反序列化: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验证的更多相关文章

  1. Django的Form验证(2)

    Django的Form验证(2) Form的含义及作用: 用于验证用户请求数据合法性的一个组件(校验数据的合法性) Django的Form实现步骤: 创建一个验证用户请求的模板 from django ...

  2. Django中Form验证

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一,Form验证 第一种操作:主要是这三个函数 ...

  3. django 使用form验证用户名和密码

    form验证可以减少查询数据库,所以代码先预先验证,有问题可以返回给前端显示 1.在users文件夹下新建forms.py文件,用来验证用户名和密码是否为空,密码长度是否大于6 # -*- codin ...

  4. django的form验证机制

    今天遇到了一个奇怪的问题,django中formview一直返回200,但是却没有执行form_valid方法,然后在其中加了一个form_invalid方法: class StudentRegist ...

  5. Django之Form验证

    view.py 配置 from django import forms from django.forms import fields # Create your views here. class ...

  6. Python Django的分页,Form验证,中间件

    本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...

  7. Django form验证

    # 模版 class LoginForm(forms.Form): # 模版中的元素 user = forms.CharField(min_length=6,error_messages={" ...

  8. [py][mx]django form验证-给db减压

    django form认证-解压db压力 一般系统都需要前后端都验证 前端验证容器逃逸破解,如通过js console口去发 试想如果后端只有db验证,那么前端无论发什么后端都查询一次db,对db压力 ...

  9. Django 博客项目02 Form验证+ 上传头像(预览)+Ajax用户注册

    头像预览 $("#avatar_file").change(function(){ // 获取上传的文件对象 var file=$(this)[0].files[0]; // 读取 ...

随机推荐

  1. 教你如何提高 PHP 代码的质量

    说实话,在代码质量方面,PHP 的压力非常大.通过阅读本系列文章,您将了解如何提高 PHP 代码的质量. 我们可以将此归咎于许多原因,但这肯定不仅仅是因为 PHP 生态系统缺乏适当的测试工具.在本文中 ...

  2. Djangoday3template

    template第一个demo从后台传递数据到前端从后台传递list前端for循环显示内容后台传输dict到前端 template第一个demo template存在app/templates目录下 ...

  3. AWK工具 使用介绍

    第6周第5次课(4月27日) 课程内容: 9.6/9.7 awk扩展把这里面的所有练习题做一下http://www.apelearn.com/study_v2/chapter14.html 9.6/9 ...

  4. EF分页查询

    /// <summary> /// 分页查询 + 条件查询 + 排序 /// </summary> /// <typeparam name="Tkey" ...

  5. Flask 蓝图机制及应用

    我们都知道 flask 是一个轻量级的 web 框架,相对于其他同类型框架更为灵活.轻便.安全且容易上手.开发者可以随意编写自己想要的项目结构,同时还有很多的第三方库供君选择.但是灵活的同时也带来了相 ...

  6. 最新Navicat Premium12 破解方法,亲测可用

    1.下载Navicat Premium 官网https://www.navicat.com.cn/下载最新版本下载安装(文末,网盘地址有64位安装包和注册机下载) 2.激活Navicat Premiu ...

  7. 分享一个Vue数组赋值的错误

    今天在写项目用到Vue的时候,遇到的一个问题,纠结了好一会,首先我的代码是这样的 有没有毛病!!  开始我感觉是没啥毛病啊,按照之前写Java代码的逻辑,我感觉这没一点毛病 . 但是它就是有毛病, 假 ...

  8. 洛谷 题解 P4613 【[COCI2017-2018#5] Olivander】

    我又双叒叕被包菜辣! P4613 [COCI2017-2018#5] Olivander 首先,不知道为什么这题无法提交翻译: 所以,我先放个翻译: 哈利波特在与伏地魔的战斗中损坏了他的魔杖.他决定在 ...

  9. docker tomcat镜像部署springbootwar包

    springboot打war包 1.在pom文件中增加插件 <build> <finalName>xx</finalName> <plugins> &l ...

  10. Mysql基础02-约束

    约束与索引 概念 1.数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability). 实体完整性(Entity Integrity):例如,同一个表 ...