Django的form,model自定制
阿新 • • 發佈:2018-08-29
urn rem ner form表單提交 .sh pla err class splay
一、Form組件原理:
django框架提供了一個form類,來處理web開發中的表單相關事項。眾所周知,form最常做的是對用戶輸入的內容進行驗證,為此django的forms類提供了全面的內容驗證和保留用戶上次輸入數據的支持。
form組件有2大大功能
對用戶提交的內容進行驗證(from表單/Ajax)
保留用戶上次輸入的內容
form組件驗證的流程
- obj=Form()form組件類實例化時找到類中所有的字段 把這些字段 變成組合成字典;self.fields={‘user’:正則表達式1,‘pwd’:正則表達式2}
- 循環self.fields字典(自己寫的字段)for k,v in self.fields.items():,K是user,pwd,v是正則表達式
- 每次循環通過self.fields字典的鍵, 一個一個的去get前端POST提交的數據 得到用戶輸入數據;input_value= request.post.get(‘k’)(所以form字段的名稱,要和前端的name屬性匹配)
- 每次拿到用戶輸入的數據 (input_value)和進行正則表達式匹配;
- 匹配成功flag=True 匹配失敗flag=falsh,最後 return flag obj.is_valid=flag。如果For自帶的規則和正則滿足不了驗證需求,可在Form類中自定義方法,做擴展。
- 每個字段驗證通過後,每個字段執執行self.clean_filelds函數(自定義 對Form類中的字段做單獨驗證,比如去數據庫查詢判斷一下用戶提交的數據是否存在?)
- 執行Form組件的clean_form方法進行整體驗證!(既然每個字段都驗證了,就可以對用戶提交的數據做整體驗證了!比如進行聯合唯一的驗證)
- 最後執行類似 clean_form的post_clean方法結束驗證。(一般不使用post_clean做自定義過濾,clean_form方法完全可以解決)
form表單提交驗證
form表單(會發起 get)提交刷新失去上次內容
from django.shortcuts importView Coderender,HttpResponse,redirect from django.forms import Form from django.forms import fields class Login(Form): #from驗證規則 用戶名 6-10字符 required不能為空 name=fields.CharField(max_length=10, min_length=6, required=True, error_messages={ ‘required‘:‘用戶名不能為空‘, #error_messages參數 自定義錯誤信息 ‘min_length‘:‘太短了‘, ‘max_length‘: "太長了", } ) # z註意name 必須和 from表單提交的一致,要麽二則怎麽對比校驗呢 pwd= fields.CharField(min_length=3, required=True, error_messages={ ‘required‘: ‘密碼不能為空‘, # error_messages參數 自定義錯誤信息 ‘min_length‘: ‘太短了‘, ‘max_length‘: "太長了", } ) def index(request): if request.method==‘GET‘: return render(request,‘login.html‘) else: obj=Login(request.POST) #把客戶端提交來的form表單和 和匹配規則放在一起 res=obj.is_valid() #自動校驗 給出結果 True 或者 False if res: #驗證成功後obj.cleaned_data獲取成功的數據,字典類型正好對應數據 的批量操作 print(obj.cleaned_data) return redirect(‘http://www.baidu.com‘) #obj.errors獲取錯誤信息(對象類型)就可以傳到前端顯示了! else: return render(request,‘login.html‘,{‘obj‘:obj})
Aja提交驗證
Ajax不會刷新,上次輸入內容自動保留
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ajx提交</title> </head> <body> <form method="post" action="/aja_login/" id="f1"> {%csrf_token%} <p>用戶:<input type="text" name="name"></p> <p>密碼:<input type="password" name="pwd"></p> <p><input type="button" onclick="Ajxform()" value="aja提交"></p> </form> </body> <script src="/static/zhanggen.js"></script> <script> function Ajxform(){ $(‘.c1‘).remove() $.ajax({ url:‘/alogin/‘, type:‘POST‘, dataType:‘JSON‘, data:$(‘#f1‘).serialize(), success:function (args) { if (args.status){ } else{ {# {status: false, msg: Object}#} {# console.log(args);#} {# Jquery循環服務端 傳過來的 錯誤信息對象#} $.each(args.msg,function (index,value) { console.log(index,value); {# index----> name ["太短了"]#} {# value-----pwd["密碼不能為空"]#} var tag=document.createElement(‘span‘); tag.innerHTML= value[0]; tag.className=‘c1‘; console.log(index); {# 尋找input下 屬性為 name 和pwd的標簽(字符串拼接) 在他們後半加 上tag標簽也就是錯誤 信息 #} $(‘#f1‘).find(‘input[name="‘+ index +‘"]‘).after(tag) }) } }})} </script> </html>View Code
views
from django.shortcuts import render,HttpResponse,redirect from django.forms import Form from django.forms import fields import json class Login(Form): #from驗證規則 用戶名 6-10字符 required不能為空 name=fields.CharField(max_length=10, min_length=6, required=True, error_messages={ ‘required‘:‘用戶名不能為空‘, #error_messages參數 自定義錯誤信息 ‘min_length‘:‘太短了‘, ‘max_length‘: "太長了", } ) # z註意name 必須和 from表單提交的一致,要麽二則怎麽對比校驗呢 pwd= fields.CharField(min_length=3, required=True, error_messages={ ‘required‘: ‘密碼不能為空‘, # error_messages參數 自定義錯誤信息 ‘min_length‘: ‘太短了‘, ‘max_length‘: "太長了",}) def agx_login(request): ret={‘status‘:True,‘msg‘:None} if request.method==‘GET‘: return render(request,‘ajalogin.html‘) else: obj=Login(request.POST) ret[‘status‘]=False ret[‘msg‘]=obj.errors return HttpResponse(json.dumps(ret))View Code
動態生成HTML標簽,保留用戶上次輸入的內容
如何保留用戶上次輸入的內容?
由於form表單submit之後(發送post請求) 數據提交到 後端,不管前端輸入的數據是否正確,服務端也要響應,所以頁面會刷新;
所以無法保留用戶上次輸入的內容;如何解決呢?
- 把定義的定義的Form類,實例化(obj=Login() )內部調用一個__str__的方法,如果沒有傳值 返回<input type="text" name=“字段”>name=‘字段名空的input標簽
- 把這個實例化之後的對象傳到前端顯示,讓用戶輸入值;用戶輸入值通過post方法提交到後臺。
- 如果後臺實例化一個對象 obj=Login(request.POST)傳入了值, <input type="text" name=“字段” value=‘request.post的數據‘>然後後端再返回客戶端就可以看到用戶輸入的值了!
保留用戶上次輸入的內容 是利用了 obj=Login(request.POST)接收了用戶輸入的值
承上啟下 form組件的套路(執行流程):
(1)在後端定義類和字段,實例化Form類;
(2)到用戶 發送get請求時,服務端渲染到模板(空標簽/默認值)發送到客戶端顯示
(3)客戶端填數據,POST提交到後端;
(4)後端驗證,返回結果給前端;(切記Form組件是在後端生成,發送給客戶端顯示,客戶端填完數據在發回服務端!)
Django的form,model自定制