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

827870-20160322162041386-636119032.png

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

827870-20160322162042026-1275103087.png

























转载于:https://www.cnblogs.com/daliangtou/p/5307087.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值