• Django的Form验证


    Django的Form验证

    Form验证:Form提交Form表单数据验证

    • 针对Form提交的数据进行验证

      1. 创建模板 class loginForm()
      2. 请求提交给模板,创建对象 obj=loginForm(request.POST)
      3. 进行验证 obj.is_valid
      4. 获取正确信息 obj.clean()
      5. 获取错误信息 obj.errors
    • 后端返回给前端错误信息

      刷新页面,模板对象内容值丰富(参数),(点击提交)刷新页面后值和报错信息都有

    • 后端自动在前端生成html,保留前端信息

      1. 自动生成html标签
      2. 保留上一次提交的数据

      注:测试时,要打开控制台修改自动生成的邮箱input的type="text"(修改掉高级浏览器的cream)

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <h1>Django的Form表单验证</h1>
      <form action="/login/" method="post">
      <!--    自动生成Html标签,并记录上一次输入的值    -->
          <p>用户ID:{{ oo.userID }}
          <span>{{ oo.errors.userID.0 }}</span></p>
          <p>email:{{ oo.userEmail }}
          <span>{{ oo.errors.userEmail.0 }}</span></p>
          <p>密码:<input type="text"></p>
      <!--    动态数据生成    
          <p>用户ID:<input type="text" name="userID" placeholder="请输入用户ID">
          <span>{{ oo.errors.userID.0 }}</span></p>
          <p>email:<input type="text" name="userEmail" placeholder="请输入邮箱地址">
          <span>{{ oo.errors.userEmail.0 }}</span></p>
          <p>密码:<input type="text"></p>  -->
          <p><input type="submit" value="提交"></p>
      </form>
      </body>
      </html>
      
      from django.shortcuts import render,redirect
      from django import forms
      from django.forms.utils import ErrorList
      # Create your views here.
      class loginForm(forms.Form):
          userID = forms.CharField(min_length=6,error_messages={"required":"用户ID不能为空",
                                                                "min_length":"用户名长度不能小于6"})
          userEmail = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"})
      def login(request):
          if request.method == "GET":
              obj = loginForm()  #默认GET,就不需要添加request.Post参数
              #obj = loginForm({"userID":456,"userEmail":789})  #记录的上一次输入的值
              return render(request,"login.html",{'oo':obj})
          elif request.method == "POST":
              obj = loginForm(request.POST)
              status = obj.is_valid()
              print(status)
              if status:
                  pad = obj.clean()
                  print(pad)
              else:
                  #error_obj = obj.errors.as_json() #字典形式输出(默认是ul li形式输出)
                  #error_obj = obj.errors #ul li形式输出
                  # print(error_obj)
                  # print(error_obj['userID'],type(error_obj['userID']))
                  # print(error_obj['userID'][0],type(error_obj['userID'][0]))
                  # print(error_obj['userEmail'],type(error_obj['userEmail']))
                  # print(error_obj['userEmail'][0],type(error_obj['userEmail'][0]))
                  print(obj.errors['userID'][0], type(obj.errors['userID'][0]))
                  print(obj.errors['userEmail'][0], type(obj.errors['userEmail'][0]))
              return render(request,"login.html",{'oo':obj})
      

    Form验证:Ajax提交Form表单数据验证

    • 针对提交数据进行验证
    • 错误信息处理
      1. 两次反序列化:obj.errors.as_json() 默认数据类型str(字符串)
      2. 一次反序列化:obj.errors.as_data() 默认数据类型dict(字典)

    注:isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

    1.isinstance()与type()区别:

    • type()不会认为子类是一种父类类型不考虑继承关系。

    • isinstance()会认为子类是一种父类类型,考虑继承关系。

      判段两个类型是否相同时要清楚是否需要考虑继承关系,不考虑继承就用type()判断,需要考虑就用isinstance()判断。

    2.ValidationError类型的数据在python中不支持json.dumps()序列化,所以需要自定义序列化类型创建cls=...

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="/static/jquery-2.1.4.min.js"></script>
        <style>
        .error-msg{
            color: red;
            font-size: 12px;
        }
        </style>
    </head>
    <body>
    <h1>Django的Form表单验证</h1>
    <form id="act">
        <p>用户ID:<input type="text" name="userID" placeholder="请输入用户ID">
        </p>
        <p>email:<input type="text" name="userEmail" placeholder="请输入邮箱地址">
        </p>
        <p>密码:<input type="text"></p>
        <input type="button" id="ajax_button" value="提交">
    </form>
    <script>
        $(function(){
            $("#ajax_button").click(function(){
                //var userID = $('form input[name="userID"]').val();
                //var userEmail = $('form input[name="userEmail"]').val();
                //var act = $("#act").serialize();
                //console.log(userID,userEmail,act);
                $.ajax({
                    url:"/logins/",
                    type:"POST",
                    data:$('#act').serialize(),
                    success:function(arg){
                        $('.error-msg').remove();
                        var v1 = JSON.parse(arg);
                        console.log(v1);
                        if(v1.status){
                            var  error_obj = v1.error;
                            $.each(error_obj,function(k,v){
                                 // k: user 或 email
                                // v: [{}{}{},]
                                var tag = document.createElement('span');
                                tag.className = 'error-msg';
                                tag.innerHTML = v[0].message;
                                $("input[name='"+k+"']").after(tag);
                            })
                        }else{
                            location.href = "/logins/"
                        }
                    }
                })
            });
        });
    </script>
    <!--注:$.each(data,function(k,v){})这个方法是jQuery的通用遍历方法,它可以遍历数组、json对象以及dom元
    素。遍历数组时,回调函数的第一个参数为遍历的下标,第二个为遍历的值,记作$.each(data,function(i,v){});-->
    </body>
    </html>
    
    import json
    class loginForm(forms.Form):
        userID = forms.CharField(min_length=6,error_messages={"required":"用户ID不能为空",
                                                              "min_length":"用户名长度不能小于6"})
        userEmail = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"})
    def logins(request):
        if request.method == "GET":
            return render(request,"logins.html")
        elif request.method == "POST":
            ret = {"status":True,"error":None,"data":None}
            obj = loginForm(request.POST)
            if obj.is_valid():
                print(obj.clean())
            else:
                #两次反序列化
                # ret_str = obj.errors.as_json() #ret_str是一个字符串
                # ret["status"] = False
                # ret["error"] = ret_str
                #一次反序列化
                ret["status"] = False
                ret["error"] = obj.errors.as_data() #字典类型
                #print(type(obj.errors.as_data()))
                print(ret["error"])
                #{'userID': [ValidationError(['用户名长度不能小于6'])], 'userEmail': [ValidationError(['邮箱格式错误'])]}
                print(ret["error"]['userID'])
                #[ValidationError(['用户名长度不能小于6'])]
            return HttpResponse(json.dumps(ret,cls=JsonCustomEncoder))
    from django.core.validators import ValidationError
    class JsonCustomEncoder(json.JSONEncoder):
        def default(self,field):
            if isinstance(field,ValidationError): #判断是否为相同类型
                return {'code':field.code,'message':field.message}
            else:
                return json.JSONEncoder.default(self,field)
    

  • 相关阅读:
    各种不同的mq
    24. Swap Nodes in Pairs
    应用中有使用到集群么?多大规模?
    曹工杂谈:用好verbose,Jar包冲突不再难
    曹工杂谈:Java 类加载还会死锁?这是什么情况?
    Linux下使用docker 拉取 vsftpd 镜像搭建 Ftp 服务器,连接 Ftp 时遇到的错误(425 Failed to establish connection)
    曹工杂谈:Linux服务器上,Spring Boot 原地修改 jar 包配置文件/替换class文件,免去重复上传的麻烦
    曹工杂谈:手把手带你读懂 JVM 的 gc 日志
    曹工杂谈:一道阿里面试题,两个线程交替打印奇偶数
    曹工说Tomcat4:利用 Digester 手撸一个轻量的 Spring IOC容器
  • 原文地址:https://www.cnblogs.com/wylshkjj/p/11995509.html
Copyright © 2020-2023  润新知