Django的Form驗證

Django的Form驗證

Form驗證:Form提交Form表單數據驗證

  • 針對Form提交的數據進行驗證html

    1. 建立模板 class loginForm()
    2. 請求提交給模板,建立對象 obj=loginForm(request.POST)
    3. 進行驗證 obj.is_valid
    4. 獲取正確信息 obj.clean()
    5. 獲取錯誤信息 obj.errors
  • 後端返回給前端錯誤信息前端

    刷新頁面,模板對象內容值豐富(參數),(點擊提交)刷新頁面後值和報錯信息都有python

  • 後端自動在前端生成html,保留前端信息jquery

    1. 自動生成html標籤
    2. 保留上一次提交的數據

    注:測試時,要打開控制檯修改自動生成的郵箱input的type="text"(修改掉高級瀏覽器的cream)ajax

    <!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()。django

1.isinstance()與type()區別:json

  • 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)

相關文章
相關標籤/搜索