Django--form验证及错误处理
需求
from表单验证和ajax验证时返回的错误信息处理
速查
1、form表单提交时错误信息显示
views
|
1
2
|
error = form表单实例化对象.errorsreturn render(request,'前端html',{'obj':form表单实例化对象,'error':error}) #传到前端用simple_tag解析 |
html
|
1
2
|
{% load xx %} <!--导入自定义sample_tag语言文件--><span>{% error_msg error.username %}</span> <!--error.username当做参数传给error_msg函数,并获取返回值--> |
simple_tag
|
1
2
3
4
5
|
@register.simple_tagdef error_msg(error_list): if error_list: return error_list[0] return '' |
2、ajax提交时错误信息返回
views
|
1
2
|
error = obj.errors.as_json()return HttpResponse(error) |
html
|
1
2
3
4
5
6
|
$.ajax({ success: function(arg){ //arg是返回值,必须是字符串 var callback_dict = $.parseJSON(arg); $('#uname_error').text(callback_dict.username[0].message); } }) |
知识点
obj=表单生成文件.表单创建的类(request.POST)
request.POST:所有提交信息
obj.is_valid():判断提交数据是否正确
obj.clean():获取提交的所有数据
obj.errors():获取提交的所有错误信息,有三种表示方式(as_ul、as_json、as_data):
form表单提交用默认的,type<class django.forms.utils.ErrorDict>
ajax返回信息用as_json(),type<'str'>
错误信息里包含的字段和form里的字段一样,错误是个列表,取值obj.errors['username'][0]
html中jinja2语法取字典是不能用errors['key']的方式,得用errors.key;如果获取obj.errors['username'][0],就得用sample_tag
详细
1、form表单提交时错误信息显示
app01/views/account.py
1
2
3
4
5
6
7
8
9
10
11
from app01.forms import account as AccountForm
def login(request):
obj = AccountForm.LoginForm(request.POST)
if request.method=='POST':
if obj.is_valid():
all_data = obj.clean()
else:
error = obj.errors
return render(request,'account/login.html',{'obj':obj,'error':error})
return render(request,'account/login.html',{'obj':obj})
为什么使用sample_tag去取值,而不取好了再传到html,因为如果字段很多的话,要分别定义每个的错误;
templates/login.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{% load xx %} <!--导入自定义sample_tag语言文件-->
<html lang="en">
<head></head>
<body>
<form action="/login/" method="post">
<p>
{{ obj.username }}
<span>{% error_msg error.username %}</span> <!--error.username当做参数传给error_msg函数,并获取返回值-->
</p>
<p>
{{ obj.password }}<span>{% error_msg error.password %}</span>
</p>
<input type="submit" value="submit" />
</form>
</body>
</html>
app01/templatetags/xx.py
1
2
3
4
5
6
7
8
9
10
from django import template
from django.utils.safestring import mark_safe
from django.template.base import resolve_variable, Node, TemplateSyntaxError
register = template.Library()
@register.simple_tag
def error_msg(error_list):
if error_list:
return error_list[0]
browser
|
1
2
3
4
5
6
7
8
9
10
11
|
from app01.forms import account as AccountFormdef login(request): obj = AccountForm.LoginForm(request.POST) if request.method=='POST': if obj.is_valid(): all_data = obj.clean() else: error = obj.errors return render(request,'account/login.html',{'obj':obj,'error':error}) return render(request,'account/login.html',{'obj':obj}) |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{% load xx %} <!--导入自定义sample_tag语言文件--><html lang="en"><head></head><body> <form action="/login/" method="post"> <p> {{ obj.username }} <span>{% error_msg error.username %}</span> <!--error.username当做参数传给error_msg函数,并获取返回值--> </p> <p> {{ obj.password }}<span>{% error_msg error.password %}</span> </p> <input type="submit" value="submit" /> </form></body></html> |
|
1
2
3
4
5
6
7
8
9
10
|
from django import templatefrom django.utils.safestring import mark_safefrom django.template.base import resolve_variable, Node, TemplateSyntaxErrorregister = template.Library()@register.simple_tagdef error_msg(error_list): if error_list: return error_list[0] |

2、ajax提交时错误信息返回
ajax必须返回的是字符串,所以用as_json()格式。
先看as_json获取的信息格式
|
1
2
3
4
5
6
7
8
|
{ "username": [ {"message": "This field is required.", "code": "required"} ], "password": [ {"message": "This field is required.", "code": "required"} ]} |
app01/views/account.py
|
1
2
3
4
5
6
7
8
9
10
11
|
from app01.forms import account as AccountFormdef login(request): obj = AccountForm.LoginForm(request.POST) if request.method=='POST': if obj.is_valid(): all_data = obj.clean() else: error = obj.errors.as_json() return HttpResponse(error) return render(request,'account/login.html',{'obj':obj}) |
templates/login.html
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<form action="/login/" method="post"> <p> {{ obj.username }} <span id="uname_error"></span> </p> <p> {{ obj.password }} <span id="pwd_error"></span> </p>{# <input type="submit" value="submit" />#} <input type="button" value="AjaxSubmit" onclick="AjaxSubmit();"/></form><script src="{{ STATIC_URL }}js/jquery-2.1.4.min.js"></script><script type="text/javascript"> function AjaxSubmit(){ $.ajax({ url: '/login/', type: 'POST', data: {'username':'','password':''}, //就当提交了一个空数据,制造错误 success: function(arg){ //arg是返回值,必须是字符串 var callback_dict = $.parseJSON(arg); $('#uname_error').text(callback_dict.username[0].message); $('#pwd_error').text(callback_dict.password[0].message);{# console.log(callback_dict.username[0].message)#} } }) }</script> |
app01/forms/account.py
|
1
2
3
4
5
|
from django import formsclass LoginForm(forms.Form): username = forms.CharField() password = forms.CharField(widget=forms.PasswordInput()) |
browser

Django--form验证及错误处理的更多相关文章
- 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 form验证是否用户名已存在
想通过django的Form模块进行数据库中是否已存在用户名的验证,首先我先调用了数据库用户名字段所有的值,发现是个queryset对象. 随后经过查询后发现queryset查询集对象可以调用list ...
- Django form 中文提交 错误
在文件头部添加 刻解决 import sys reload(sys) sys.setdefaultencoding("utf-8")
- Django 进阶篇之 Form验证
Django Form验证 在实际的生产环境中比如登录和验证的时候,我们一般都使用Jquery+ajax来判断用户的输入是否为空,假如JS被禁用的话,咱们这个认证屏障是不是就消失了呢?(虽然一般不会禁 ...
- django的form验证机制
今天遇到了一个奇怪的问题,django中formview一直返回200,但是却没有执行form_valid方法,然后在其中加了一个form_invalid方法: class StudentRegist ...
- Python Web框架篇:Django Form组件
Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...
- 04: Form 验证用户数据 & 生成html
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- [oldboy-django][2深入django]form表单clean_xx, clean完成数据验证+ form错误信息
form后台生成form里面的Input标签,以及设置Input的属性 # 需求 后台生成form里面的input标签,并设置input标签的属性, class RegisterForm(Form): ...
- django form表单验证
一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...
随机推荐
- The last packet sent successfully to the server was 0 milliseconds ago
出现异常”The last packet sent successfully to the server was 0 milliseconds ago.“的大部分原因是由于数据库回收了连接,而系统的缓 ...
- Hibernate HQL查询(1)
1. 查询整个映射对象所有字段 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql ="from Users"; ...
- 数据结构(栈&堆 )
在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存储区,主要功能 ...
- 【经典】Noip贪心
一.经典例题 例一:排队接水 题意:n个人到r个水龙头接水,装满水桶的时间分别是t1,t2,t3.... 接水时间是整数且互不相等,怎样安排顺序使每个人等待的 时间和最小. 题解:排队越靠前计算次数越 ...
- 数据库中通过group by找出表中的重复数据
有时候在做数据割接时会碰到数据插入失败的情况,大部分都是导出的数据中存在重复导致的.我们可以通过查询语句带分组条件来确认是否有重复数据.例如我现在有表 t_wlf_info,其中有个 username ...
- (转)如何修正DIV float之后导致的外部容器不能撑开的问题
本文转载自:http://blog.csdn.net/qsdnet/article/details/1534005 在写HTML代码的时候,发现在Firefox等符合W3C标准的浏览器中,如果有一个D ...
- videojs集成--播放rtmp流
之前说到已经把流推送过来了,这时候就可以使用videojs来进行显示播放. 首先要先有一个文件,那就是video-js.swf 因为,这种播放方式html已经不能很好的进行播放了,需要用到flash来 ...
- 【转】Jmeter的正则表达式未正确提取数据
在进行脚本调试时,在Apply-Money-Page中需要Save-base中header的id参数,采用正则表达式提取器获取 使用正则表达式提取器,结果无法获取到需要的参数 最后定位是因为[?]是一 ...
- LevelDB Cache实现机制分析
几天前淘宝量子恒道在博客上分析了HBase的Cache机制,本篇文章,结合LevelDB 1.7.0版本的源码,分析下LevelDB的Cache机制. 概述 LevelDB是Google开源的持久化K ...
- 2017中国大学生程序设计竞赛 - 女生专场(dp)
Building Shops Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...