Django進階(一)

choice參數

choice參數
用戶性別
用戶學歷
用戶工做狀態
客戶來源
...html

choices = (
  (1,'male'),
  (2,'female'),
  (3,'others')
)
gender = models.IntegerField(choices=choices)
"""
1.若是我存的是上面元組中數字會怎麼樣
2.若是我存的數字不在元組範圍內又會怎樣
    1.數字沒有對應關係 是能夠存的
"""
from app01 import models
user_obj = models.Userinfo.objects.filter(pk=4).first()
print(user_obj.username)
print(user_obj.gender)
# 針對choices字段 若是你想要獲取數字所對應的中文 你不能直接點字段
# 固定句式   數據對象.get_字段名_display()  當沒有對應關係的時候 該句式獲取到的仍是數字
print(user_obj.get_gender_display())

實例1前端

record_choices = (('checked', "已簽到"),
                  ('vacate', "請假"),
                  ('late', "遲到"),
                  ('noshow', "缺勤"),
                  ('leave_early', "早退"),
                 )
record = models.CharField("上課紀錄", choices=record_choices, default="checked",

實例1python

score_choices = ((100, 'A+'),
                 (90, 'A'),
                 (85, 'B+'),
                 (80, 'B'),
                 (70, 'B-'),
                 (60, 'C+'),
                 (50, 'C'),
                 (40, 'C-'),
                 (0, ' D'),
                 (-1, 'N/A'),
                 (-100, 'COPY'),
                 (-1000, 'FAIL'),
                )
score = models.IntegerField("本節成績", choices=score_choices, default=-1)

MTV與MVC模型

django號稱是MTV框架,其實他仍是MVC框架
MTV:
M:models ,模型,就是數據模型,負責數據的存取;
T: templates ,模板,負責頁面的展現邏輯;
V: views ,視圖函數,負責業務邏輯的處理;
MVC:
M:models, 模型,就是數據模型,負責數據的存取;
V: views, 視圖,負責頁面的展現邏輯;
C: contronner(路由匹配), 控制器,負責業務邏輯的處理;jquery

9

注: 核心目的就是爲了解耦,提升開發效率ajax

ajax

AJAX(Asynchronous Javascript And XML)翻譯成中文就是「異步的Javascript和XML」。即便用Javascript語言與服務器進行異步交互,傳輸的數據爲XML(固然,傳輸的數據不僅是XML)。(我的經驗Asyn開頭,基本都是異步相關)django

AJAX 不是新的編程語言,而是一種使用現有標準的新方法。編程

AJAX 最大的優勢是在不從新加載整個頁面的狀況下,能夠與服務器交換數據並更新部分網頁內容。(這一特色給用戶的感覺是在不知不覺中完成請求和響應過程)json

AJAX 不須要任何瀏覽器插件,但須要用戶容許JavaScript在瀏覽器上執行。後端

  • 同步交互:客戶端發出一個請求後,須要等待服務器響應結束後,才能發出第二個請求;
  • 異步交互:客戶端發出一個請求後,無需等待服務器響應結束,就能夠發出第二個請求。

ajax語法結構

異步提交

同步異步:描述的任務的提交方式

​ 同步:提交任務以後 原地等待任務的返回結果 期間不幹任何事兒
​ 異步:提交任務以後 不肯地等待 直接執行下一行代碼 任務的返回經過回調機制瀏覽器

阻塞非阻塞:程序的運行狀態

​ 程序運行的三狀態圖

局部刷新

​ 一個頁面 不是總體刷新 而是頁面的某個地方局部刷新

Ajax是一門js的技術,基於原生js開發實現的,可是原生的js寫代碼過於繁瑣

只學習如何使用jQuery實現ajax

什麼是 JSON ?

  • JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation)
  • JSON 是輕量級的文本數據交換格式
  • JSON 獨立於語言 *
  • JSON 具備自我描述性,更易理解

  • JSON 使用 JavaScript 語法來描述數據對象,可是 JSON 仍然獨立於語言和平臺。JSON 解析器和 JSON 庫支持許多不一樣的編程語言。

合格的json對象(json只認雙引的字符串格式):

["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["張三", "李四"] }
[ { "name": "張三"}, {"name": "李四"} ] 

不合格的json對象:

{ name: "張三", 'age': 32 }  // 屬性名必須使用雙引號
[32, 64, 128, 0xFFF] // 不能使用十六進制值
{ "name": "張三", "age": undefined }  // 不能使用undefined
{ "name": "張三",
  "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
  "getName":  function() {return this.name;}  // 不能使用函數和日期對象
}

實例:

1.展現一個前端頁面 頁面上有三個輸入框 前兩個框輸入數字 點擊按鈕朝後端發請求
頁面不刷新的狀況下 完成數字的加法運算

<input type="text" id="t1"> + <input type="text" id="t2"> = <input type="text" id="t3">
<p>
<button id="b1">計算</button>
</p>

$('#b1').on('click',function () {
  // 朝後端提交post數據
  $.ajax({
    // 1.到底朝後端哪一個地址發數據
    url:'',  // 專門用來控制朝後端提交數據的地址  不寫默認就是朝當前地址提交
    // 2.到底發送什麼請求
    type:'post',  // 專門制定ajax發送的請求方式
    // 3.發送的數據究竟是什麼
    data:{'t1':$('#t1').val(),'t2':$('#t2').val()},
    // 4.異步提交的任務 須要經過回調函數來處理
    success:function (data) {  // data形參指代的就是異步提交的返回結果
                             // 經過DOM操做將內容 渲染到標籤內容上
                             $('#t3').val(data)
                            }
  })
})
from django.shortcuts import render,HttpResponse
def index(request):
  print(request.is_ajax())  # 判斷當前請求是不是ajax請求
  if request.is_ajax():
    if request.method == 'POST':
      # print(request.POST)
      t1 = request.POST.get('t1')
      t2 = request.POST.get('t2')
      res = int(t1) + int(t2)
      return HttpResponse(res)

先後端傳輸數據編碼格式

contentType先後端傳輸數據編碼格式

form表單 默認的提交數據的編碼格式是urlencoded
    urlencoded
        username=admin&password=123這種就是符合urlencoded數據格式

        django後端針對username=admin&password=123的urlencoded數據格式會自動解析
        將結果打包給request.POST 用戶只須要從request.POST便可獲取對應信息

    formdata
        django後端針對formdata格式類型數據 也會自動解析可是不會方法request.POST中而是給你放到了request.FILES中

ajax  ajax默認的提交數據的編碼格式也是urlencoded
    username=jason&password=123

​ 總結:django後端針對不一樣的編碼格式數據 會有不一樣的處理機制以及不一樣的獲取該數據的方法

先後端在作數據交互的時候 必定必定要代表你所發的的數據究竟是什麼格式

前段後交互 你不能騙人家
你的數據時什麼格式 你就應該準確無誤告訴別人是什麼格式

Ajax傳json格式數據

​ django後端針對json格式的數據 不會自動幫你解析 會直接原封不動的給你放到request.body中
​ 你能夠手動處理 獲取數據

​ json_bytes = request.body
​ json_str = str(json_bytes,encoding='utf-8')
​ json_dict = json.loads(json_str)

​ 注意點
​ 1. 指定contentType參數
​ contentType:'application/json',
2. 要將你發送的數據 確保是json格式的
data:JSON.stringify({'username':'jason','password':'123'})

<form action="" method="post" enctype=""> # application/x-www-form-urlencoded 發普通鍵值, multipart/form-data 發文件,向普通兼容,反之不行。 
  <input type="text" name="username">
  <input type="password" name="password">
  <input type="file" name="myfile">
  <input type="submit">
</form>

ajax傳文件

須要利用內置對象 Formdata
    該對象既能夠傳普通的鍵值 也能夠傳文件
    
    # 獲取input獲取用戶上傳文件的文件的內容
    // 1.先經過jquery查找到該標籤
    // 2.將jquery對象轉換成原生的js對象
    // 3.利用原生js對象的方法 直接獲取文件內容
    $('#t3')[0].files[0]

​ $('#b1').click(function () {
​ // 1.先生成一個formdata對象
​ var myFormData = new FormData();
​ // 2.朝對象中添加普通的鍵值
​ myFormData.append('username',$("#t1").val());
​ myFormData.append('password',$("#t2").val());
​ // 3.朝對象中添加文件數據
​ // 1.先經過jquery查找到該標籤
​ // 2.將jquery對象轉換成原生的js對象
​ // 3.利用原生js對象的方法 直接獲取文件內容
​ myFormData.append('myfile',$('#t3')[0].files[0]);
​ $.ajax({
​ url:'',
​ type:'post',
data:myFormData, // 直接丟對象

// ajax傳文件 必定要指定兩個關鍵性的參數
        contentType:false,  // 不用任何編碼 由於formdata對象自帶編碼 django可以識別該對象
        processData:false,  // 告訴瀏覽器不要處理個人數據 直接發就行

        success:function (data) {
            alert(data)
        }
    })
})

「」「

ajax傳文件須要注意的事項
1.利用formdata對象 可以簡單的快速傳輸數據 (普通鍵值 + 文件)
2.有幾個參數
data:formdata對象

contentType:false
processData:false

」「」

序列化組件

自動把數據序列化

1.將用戶表的數據 查詢出來 返回給前端
給前端的是一個大字典 字典裏面的數據的一個個的字段
from django.core import serializers
def ser(request):
user_queryset = models.Userinfo.objects.all()
# [{},{},{},{}]
# user_list = []
# for user_obj in user_queryset:
#     user_list.append({
#         'username':user_obj.username,
#         'password':user_obj.password,
#         'gender':user_obj.get_gender_display(),
#     })
res = serializers.serialize('json',user_queryset)
print(res)
return render(request,'ser.html',locals())

ajax結合sweetalert聯合

ajax + sweetalert
        $("#b55").click(function () {
        swal({
                    title: "你肯定要刪除嗎?",
                    text: "刪除可就找不回來了哦!",
                    type: "warning",
                    showCancelButton: true,  // 是否顯示取消按鈕
                    confirmButtonClass: "btn-danger",  // 確認按鈕的樣式類
                    confirmButtonText: "刪除",  // 確認按鈕文本
                    cancelButtonText: "取消",  // 取消按鈕文本
                    closeOnConfirm: false,  // 點擊確認按鈕不關閉彈框
                    showLoaderOnConfirm: true  // 顯示正在刪除的動畫效果
                },
                function () {
                    var deleteId = 2;
                    $.ajax({
                        url: "/delete_book/",
                        type: "post",
                        data: {"id": deleteId},
                        success: function (data) {
                            if (data.code === 0) {
                                swal("刪除成功!", "你能夠準備跑路了!", "success");
                            } else {
                                swal("刪除失敗", "你能夠再嘗試一下!", "error")
                            }
                        }
                    })
                });
    })
相關文章
相關標籤/搜索