1. 程式人生 > >Django的form,model自定制

Django的form,model自定制

urn rem ner form表單提交 .sh pla err class splay

一、Form組件原理:

django框架提供了一個form類,來處理web開發中的表單相關事項。眾所周知,form最常做的是對用戶輸入的內容進行驗證,為此django的forms類提供了全面的內容驗證和保留用戶上次輸入數據的支持。

form組件有2大大功能

  對用戶提交的內容進行驗證(from表單/Ajax)

  保留用戶上次輸入的內容

form組件驗證的流程

  1. obj=Form()form組件類實例化時找到類中所有的字段 把這些字段 變成組合成字典;self.fields={‘user’:正則表達式1,‘pwd’:正則表達式2}
  2. 循環self.fields字典(自己寫的字段)for k,v in self.fields.items():,K是user,pwd,v是正則表達式
  3. 每次循環通過self.fields字典的鍵, 一個一個的去get前端POST提交的數據 得到用戶輸入數據;input_value= request.post.get(‘k’)(所以form字段的名稱,要和前端的name屬性匹配)
  4. 每次拿到用戶輸入的數據 (input_value)和進行正則表達式匹配;
  5. 匹配成功flag=True 匹配失敗flag=falsh,最後 return flag obj.is_valid=flag。如果For自帶的規則和正則滿足不了驗證需求,可在Form類中自定義方法,做擴展。
  6. 每個字段驗證通過後,每個字段執執行self.clean_filelds函數(自定義 對Form類中的字段做單獨驗證,比如去數據庫查詢判斷一下用戶提交的數據是否存在?)
  7. 執行Form組件的clean_form方法進行整體驗證!(既然每個字段都驗證了,就可以對用戶提交的數據做整體驗證了!比如進行聯合唯一的驗證)
  8. 最後執行類似 clean_form的post_clean方法結束驗證。(一般不使用post_clean做自定義過濾,clean_form方法完全可以解決)

form表單提交驗證

form表單(會發起 get)提交刷新失去上次內容

技術分享圖片
from django.shortcuts import
render,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})
View Code

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請求) 數據提交到 後端,不管前端輸入的數據是否正確,服務端也要響應,所以頁面會刷新;

所以無法保留用戶上次輸入的內容;如何解決呢?

  1. 把定義的定義的Form類,實例化(obj=Login() )內部調用一個__str__的方法,如果沒有傳值 返回<input type="text" name=“字段”>name=‘字段名空的input標簽
  2. 把這個實例化之後的對象傳到前端顯示,讓用戶輸入值;用戶輸入值通過post方法提交到後臺。
  3. 如果後臺實例化一個對象 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自定制