針對Form提交的數據進行驗證html
後端返回給前端錯誤信息前端
刷新頁面,模板對象內容值豐富(參數),(點擊提交)刷新頁面後值和報錯信息都有python
後端自動在前端生成html,保留前端信息jquery
注:測試時,要打開控制檯修改自動生成的郵箱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})
注: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)