Django--form验证及错误处理
需求
from表单验证和ajax验证时返回的错误信息处理
速查
1、form表单提交时错误信息显示
views
1
2
|
error = form表单实例化对象.errors return 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_tag def 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 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}) |
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 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 ] |
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 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.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 forms class 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 ...
随机推荐
- RabbitMQ学习系列四-EasyNetQ文档跟进式学习与实践
EasyNetQ文档跟进式学习与实践 https://www.cnblogs.com/DjlNet/p/7603554.html 这里可能有人要问了,为什么不使用官方的nuget包呐:RabbitMQ ...
- LG3628 [APIO2010]特别行动队
题意 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如(i, i + 1, . ...
- 3145 code[VS]汉诺塔游戏--递归
3145 汉诺塔游戏 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我 ...
- yii 操作cookie
原文地址:http://blog.sina.com.cn/s/blog_664c9f650100yqkn.html 设置cookie: $cookie = new CHttpCookie('mycoo ...
- Python学习系列(四)(列表及其函数)
Python学习系列(四)(列表及其函数) Python学习系列(一)(基础入门) Python学习系列(二)(基础知识) Python学习系列(三)(字符串) 一.基本概念 1,列表是什么? ...
- 洛谷 1291 [SHOI2002]百事世界杯之旅
题目:https://www.luogu.org/problemnew/show/P1291 大水题!套路!模板! 稍微注意一下输出就行了. #include<iostream> #inc ...
- sqlserver卸载
- 南阳OJ 1170 最大的数
最大的数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数 在这n个数 ...
- WCF 身份验证 通过检查客户端IP
WCF 身份验证 功能描述: 服务运行的时候,通过配置文件获取所有可访问SOA端的服务IP.每次客户调用服务时获取IP对比判定通过. 以下是获取客户端IP的代码: /***************** ...
- 【转】使用JMeter 完成常用的压力测试(二)
使用JMeter 完成常用的压力测试 Login.jsp 和welcome.jsp.其中 login.jsp 负责生成 User 对象,并调用 User 的login.当 login 返回为 true ...