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
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