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