需求

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

Django--form验证及错误处理的更多相关文章

  1. Django form验证

    # 模版 class LoginForm(forms.Form): # 模版中的元素 user = forms.CharField(min_length=6,error_messages={" ...

  2. [py][mx]django form验证-给db减压

    django form认证-解压db压力 一般系统都需要前后端都验证 前端验证容器逃逸破解,如通过js console口去发 试想如果后端只有db验证,那么前端无论发什么后端都查询一次db,对db压力 ...

  3. 关于django form验证是否用户名已存在

    想通过django的Form模块进行数据库中是否已存在用户名的验证,首先我先调用了数据库用户名字段所有的值,发现是个queryset对象. 随后经过查询后发现queryset查询集对象可以调用list ...

  4. Django form 中文提交 错误

    在文件头部添加 刻解决 import sys reload(sys) sys.setdefaultencoding("utf-8")

  5. Django 进阶篇之 Form验证

    Django Form验证 在实际的生产环境中比如登录和验证的时候,我们一般都使用Jquery+ajax来判断用户的输入是否为空,假如JS被禁用的话,咱们这个认证屏障是不是就消失了呢?(虽然一般不会禁 ...

  6. django的form验证机制

    今天遇到了一个奇怪的问题,django中formview一直返回200,但是却没有执行form_valid方法,然后在其中加了一个form_invalid方法: class StudentRegist ...

  7. Python Web框架篇:Django Form组件

    Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...

  8. 04: Form 验证用户数据 & 生成html

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  9. [oldboy-django][2深入django]form表单clean_xx, clean完成数据验证+ form错误信息

    form后台生成form里面的Input标签,以及设置Input的属性 # 需求 后台生成form里面的input标签,并设置input标签的属性, class RegisterForm(Form): ...

  10. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

随机推荐

  1. 解决Chrome关联HTML文件,图标不显示的问题。

    解决Chrome关联HTML文件,图标不显示的问题. 一.方法一 1.win+r,输入regedit,调出注册表信息,按下Ctrl+F,在注册表里搜索.在注册表里新建几个文件就可以了 a.新建Old ...

  2. 有状态与无状态 cookie session

    服务器所维护的与客户交互活动的信息称为状态信息.不保存任何状态信息的服务器称为无状态服务器(stateless server),反之则称为有状态服务器(stateful server). 面向连接对应 ...

  3. Spring IOC容器的初始化—(一)Resource定位

    前言 上一篇博文“ Spring IOC是怎样启动的 ”中提到了refresh()方法,这个就是容器初始化的入口.容器初始化共有三个阶段: 第一阶段:Resource定位 第二阶段:BeanDefin ...

  4. VBA程序的调试

    VBA程序的调试:设置断点.单步跟踪.设置监视窗 Acces的VBE编程环境提供了完整的一套调试工具和调试方法.熟练掌握好这些调试工具和调试方法的使用,可以快速.准确地找到问题所在,不断修改,加以完善 ...

  5. Weblogic配置SSl使用Https

    一 .可以开启自带的SSL连接 启动weblogic,进入左侧菜单,点击左侧的安全领域-->点击myrealm-->点击角色和策略-->点击服务器AdminServer 点击保存,w ...

  6. PCB 封装中的 公差符号形位公差位置度

    PCB 封装中的 公差符号形位公差位置度 0.08 旁边的 十字加圆就是位置度的形位公差.

  7. notifyDataSetChanged() 动态更新ListView

    有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今 ...

  8. 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

  9. jgrid相关功能用法记录

    1.获取行号var ids = $gridList.jqGrid('getGridParam', 'selarrrow'); //多选,返回选中行号组字符 var ids2 = $gridList.j ...

  10. centos 系统使用verdaccio搭建npm私库

    .安装nodejs yum install -y nodejs 2.安装verdaccio npm install -g verdaccio --unsafe-perm 3.配置 a.修改配置文件 c ...