28)django-form+ajax实现验证
form+ajax实现验证
#obj.errors返回的是ErrorDict,不是字典(虽然继承字典)
#obj.errors.as_json() 返回的字符串(前端要连续反解两次)
#obj.errors.as_data()  返回原生的字典 但是返回value 是ValidationError,不能直接序列化
1)通过errors.as_data()实现数据绑定和返回,errors.as_data()  返回原生的字典 但是返回value 是ValidationError,不能直接序列化,  通过json属性cls转换是ValidationError为字典返回。优点:前端jquery不需要JSON.parse转换两次。
2)通过errors.as_json()实现数据绑定和返回。as_json返回的是字符串。
    前端返回:需要两次JSON.parse转换(第一次:HttpResponse返回的是字符串;第二次:  返回的error字典中的value是字符串,需要在转成字典,才可以访问)
示例1:注册信息
#两种方式1:as_data(注意view中绑定方式和模板中jqeury调用方式)
froms.py
class RegisterForm(forms.Form):
    username = fields.CharField(
            error_messages={"required": "用户名不能为空"},
            widget=widgets.Input(attrs={"class": "form-control"})
    )
    email = fields.EmailField(
           error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'},
            widget=widgets.Input(attrs={"class": "form-control"})
    )
    password = fields.CharField(
            error_messages={"required": "密码不能为空"},
            widget=widgets.Input(attrs={"class": "form-control"})
    )
    password2 = fields.CharField(error_messages={"required": "密码不能为空"},
                                 widget=widgets.Input(attrs={"class": "form-control"}))
    check_code = fields.CharField(error_messages={"required": "验证码不能为空"},
                                  widget=widgets.Input(attrs={"class": "form-control"}))
    def clean_username(self):
        """
        验证用户存不存在
        :return:
        """
        obj = models.UserInfo.objects.filter(username=self.cleaned_data['username'])
        # 用户存在返回原来的值
        if not obj:
            return self.cleaned_data['username']
        else:
            raise ValidationError(message="用户已存在,请更换其他用户名", code="xxxx")
#views.py
from django.core.exceptions import ValidationError
class JsonCunstomEncode(json.JSONEncoder):
    def default(self, field):
        if isinstance(field,ValidationError):
            return {"code":field.code,"message":field.message}
        else:
            return json.JSONEncoder.default(self,field) 
def register(request):
    """
    注册
    :param request:
    :return:
    """
    ret={"status":False,"error":None,"data":None}
    if request.method=="GET":
        register_obj=forms.RegisterForm()
        return render(request, 'register.html',{"register_obj":register_obj})
    elif request.method=="POST":
        register_obj=forms.RegisterForm(request.POST)
        if register_obj.is_valid():
            ret["status"]=True
            ret["data"]=register_obj.cleaned_data
        else:
            ret["error"]=register_obj.errors.as_data()
        result=json.dumps(ret,cls=JsonCunstomEncode)
        #不能使用render,使用render返回数据,前端var data1=JSON.parse(arg)转换报错。可以使用HttpResponse直接返回数据
        #return render(request, 'register.html',{"result":result})
        return HttpResponse(result)
模块实现:
<div class="register">
    <div style="font-size: 25px; font-weight: bold;text-align: center;">
        用户注册
    </div>
    <form role="form" id="register_form">
        {% csrf_token %}
        <div class="form-group">
            <label for="username">用户名</label>
            <input type="text" class="form-control" id="username" placeholder="请输入用户名" name="username">
            <p id="error_username"></p>
        </div>
        <div class="form-group">
            <label for="email">邮箱</label>
            <input type="email" class="form-control" id="email" placeholder="请输入邮箱" name="email">
            <p id="error_email"></p>
        </div>
        <div class="form-group">
            <label for="password">密码</label>
            <input type="password" class="form-control" id="password" placeholder="请输入密码" name="password">
            <p id="error_password"></p>
        </div>
        <div class="form-group">
            <label for="confirm_password">确认密码</label>
            <input type="password" class="form-control" id="password" placeholder="请输入密码" name="password2">
            <p id="error_password2"></p>
        </div>
        <div class="form-group">
            <label for="password">验证码</label>
            <div class="row">
                <div class="col-xs-7">
                    <input type="password" class="form-control" id="password" placeholder="请输入验证码" name="check_code">
                    <p id="error_check_code"></p>
                </div>
                <div class="col-xs-5">
                    <img src="/check_code.html">
                </div>
            </div>
            <p id="show_error"></p>
        </div>
        <a id="register_a" type="submit" class="btn btn-default" >下一步</a>
    </form>
    <script src="/static/js/jquery-1.12.4.js"></script>
    <script src="/static/js/jquery.cookie.js"></script>
    <script>
$("#register_a").click(
        function(){
            $.ajax({
                url:'{% url "register" %}',
                type:"POST",
                //headers: {"X-CSRFtoken":$.cookie("csrftoken")},如果是用serialize,他就csrftoken一起发送过去,所以不需要加headers
                data:$("#register_form").serialize(),
                success:function(arg){
                    var data1=JSON.parse(arg);
                    console.log(data1);
                    //#如果返回的状态为false,输出出错的内容
                    if (!data1.status){
                        //清空所有error p标签的内容
                        $("#register_form").find('p[id*=error_]').each(
                                function(){
                                    $(this).text("")
                                }
                        )
                        //根据错误信息动态绑定到p标签
                        for (var item in data1.error){
                            var tmp='#error_'+item+''
                            $(tmp).text(data1.error[item][0].message);
                        }
                        /*
                        手动绑定标签,但是会存在error中没有的信息报错
                        $("#error_username").text(data1.error["username"][0].message);
                        $("#error_email").text(data1.error.email[0].message);
                        $("#error_password").text(data1.error.password[0].message);
                        $("#error_password2").text(data1.error.password2[0].message);
                        $("#error_check_code").text(data1.error.check_code[0].message);
                        */
                    }
                    else{
                        //跳转到后台
                        location.href='{% url "base_info" %}'
                    }
                }
            })
        }
        )
    </script>
方式2:as_json
views.py
def register(request):
    """
    注册
    :param request:
    :return:
    """
    ret={"status":False,"error":None,"data":None}
    if request.method=="GET":
        register_obj=forms.RegisterForm()
        return render(request, 'register.html',{"register_obj":register_obj})
    elif request.method=="POST":
        register_obj=forms.RegisterForm(request.POST)
        if register_obj.is_valid():
            ret["status"]=True
            ret["data"]=register_obj.cleaned_data
        else:
            ret["error"]=register_obj.errors.as_json()
        result=json.dumps(ret)
        #不能使用render,使用render返回数据,前端var data1=JSON.parse(arg)转换报错。可以使用HttpResponse直接返回数据
        #return render(request, 'register.html',{"result":result})
        return HttpResponse(result)
模板:
<div class="register">
<div style="font-size: 25px; font-weight: bold;text-align: center;">
    用户注册
</div>
<form role="form" id="register_form">
    {% csrf_token %}
    <div class="form-group">
        <label for="username">用户名</label>
        <input type="text" class="form-control" id="username" placeholder="请输入用户名" name="username">
        <p id="error_username"></p>
    </div>
    <div class="form-group">
        <label for="email">邮箱</label>
        <input type="email" class="form-control" id="email" placeholder="请输入邮箱" name="email">
        <p id="error_email"></p>
    </div>
    <div class="form-group">
        <label for="password">密码</label>
        <input type="password" class="form-control" id="password" placeholder="请输入密码" name="password">
        <p id="error_password"></p>
    </div>
    <div class="form-group">
        <label for="confirm_password">确认密码</label>
        <input type="password" class="form-control" id="password" placeholder="请输入密码" name="password2">
        <p id="error_password2"></p>
    </div>
    <div class="form-group">
        <label for="password">验证码</label>
        <div class="row">
            <div class="col-xs-7">
                <input type="password" class="form-control" id="password" placeholder="请输入验证码" name="check_code">
                <p id="error_check_code"></p>
            </div>
            <div class="col-xs-5">
                <img src="/check_code.html">
            </div>
        </div>
        <p id="show_error"></p>
    </div>
    <a id="register_a" type="submit" class="btn btn-default" >下一步</a>
</form>
<script src="/static/js/jquery-1.12.4.js"></script>
<script src="/static/js/jquery.cookie.js"></script>
<script>
    $("#register_a").click(
            function(){
                $.ajax({
                    url:'{% url "register" %}',
                    type:"POST",
                    //headers: {"X-CSRFtoken":$.cookie("csrftoken")},如果是用serialize,他就csrftoken一起发送过去,所以不需要加headers
                    data:$("#register_form").serialize(),
                    success:function(arg){
                        //第一次转换
                        var data1=JSON.parse(arg);
                        console.log(data1);
                        //#如果返回的状态为false,输出出错的内容
                        if (!data1.status){
                            //清空所有error p标签的内容
                            $("#register_form").find('p[id*=error_]').each(
                                    function(){
                                        $(this).text("")
                                    }
                            )
                            //第二次转换
                            var error_list=JSON.parse(data1.error)
                            //根据错误信息动态绑定到p标签
                            for (var item in error_list){
                                var tmp='#error_'+item+''
                                $(tmp).text(error_list[item][0].message);
                            }
                            /*
                            手动绑定标签,但是会存在error中没有的信息报错
                            $("#error_username").text(data1.error["username"][0].message);
                            $("#error_email").text(data1.error.email[0].message);
                            $("#error_password").text(data1.error.password[0].message);
                            $("#error_password2").text(data1.error.password2[0].message);
                            $("#error_check_code").text(data1.error.check_code[0].message);
                            */
                        }
                        else{
                            //跳转到后台
                            location.href='{% url "base_info" %}'
                        }
                    }
                })
            }
    )
</script>												
											28)django-form+ajax实现验证的更多相关文章
- Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)
		
一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...
 - django form表单验证
		
一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...
 - django form 表单验证
 - [oldboy-django][2深入django]Form总结
		
1 form总结 # Form数据格式验证 - 原理: - 流程 a.写类LoginForm(Form): 字段名 = fields.xxFields() # 验证规则,本质是正则表达式(fields ...
 - Django基础——Form&Ajax篇
		
一 Form 在实际的生产环境中,登录和注册时用户提交的数据浏览器端都会使用JavaScript来进行验证(比如验证输入是否为空以及输入是否合法),但是浏览器可能会禁用JavaScirpt,同时也有人 ...
 - Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作
		
一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...
 - the django travel three[form表单验证]
		
一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...
 - 第三百一十一节,Django框架,Form表单验证
		
第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...
 - 九  Django框架,Form表单验证
		
表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
 
随机推荐
- 子线程导致 Windows 服务停止的情况(Topshelf 结合 Quartz.NET)
			
Ø 前言 本文主要记录子线程导致 Topshelf 和 Quartz.NET 的 Windows 服务停止的现象,以及使用几种常用子线程的注意事项.因为我们有时可能需要开启多个线程执行复杂的逻辑,如 ...
 - MYSQL ERROR 1045 (28000) Access denied for user (using password YES)问题的解决
			
我的Linux是Centos6.7的版本,本机上Mysql突然怎么连接都进不去 报错:MYSQL ERROR 1045 (28000) Access denied for user (using pa ...
 - mysql 约束和外键约束实例
			
1.约束保证数据的完整性和一致性. 2.约束分为表级约束和列级约束.(根据约束所针对的字段的数目的多少来决定) 列级约束:对一个数据列建立的约束 表级约束:对多个数据列建立的约束 列级约束即可以在列定 ...
 - cpp 标准库
			
源:http://bbs.csdn.net/topics/300040713 C++标准库的所有头文件都没有扩展名.C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能.< ...
 - Coursera Deep Learning 3 Structuring Machine Learning Projects, ML Strategy
			
Why ML stategy 怎么提高预测准确度?有了stategy就知道从哪些地方入手,而不至于找错方向做无用功. Satisficing and Optimizing metric 上图中,run ...
 - Liunx/RHEL6.5 Oracle11 安装记录
			
1.创建用户组 groupadd oinstall #创建用户组oinstall groupadd dba #创建用户组dba useradd -g oinstall -g dba -m oracle ...
 - css3动画transition animation
			
CSS动画简介 transition animation transition过渡:css3通过transitions属性引入时间概念,通过开始.结束状态自动计算中间状态,实现状态改变的过渡效果 ...
 - Javascript入门(四)条件控制语句
			
一.条件控制语句 1. if <script type="text/javascript"> var num = 1 if( num == 3 ){ alert(&qu ...
 - VGGNet学习——实践
			
0 - DataSet http://www.csc.kth.se/~att/Site/Animals.html 1 - Code 1.1 - Import Packages import tenso ...
 - oracle坏块问题的处理
			
一.背景 今天有用户反映数据库连不上了,查看日志发现有数据库坏块. 查看数据库日志,有如下报错: ORA-01578: ORACLE , 93642) ORA-01110: 1: '/oracle/a ...