1. 程式人生 > 其它 >Django中資料傳輸編碼格式、ajax傳送json資料、ajax傳送檔案、django序列化元件、ajax結合sweetalert做二次彈窗、批量增加資料

Django中資料傳輸編碼格式、ajax傳送json資料、ajax傳送檔案、django序列化元件、ajax結合sweetalert做二次彈窗、批量增加資料

目錄

前後端傳輸資料的編碼格式(contentType)

提交post請求的兩種方式:

  • form表單
  • ajax請求

前後端傳輸資料的編碼格式

  • urlencoded
  • formdata(form表單裡的)
  • jaon

研究form表單

預設的資料編碼格式是urlencoded
資料格式:username=jason&password=123

當提交方式改為enctype="multipart/form-data"後

總結

urlencoded編碼格式

django後端針對符合urlencoded編碼格式的資料會自動幫你解析封裝到request.POST中
eg: username=jason&password=123	>>> request.POST

formdata編碼格式

針對普通的鍵值對還是解析到request.POST中,而將檔案解析到request.FILES中

json

form表單不支援傳送json資料

研究ajax

預設的編碼格式是urlencoded
資料格式:username=jason&age=20

總結

django後端針對符合urlencoded編碼格式的資料都會自動幫你解析封裝到request.POST中
  	username=jason&age=20	>>> request.POST

ajax傳送json格式資料

注意事項

1.contentType引數指定成: application/json

2.資料必須是json資料,不是要用JSON.stringify轉成json格式

3.django後端要用request.body獲取並處理而不是用request.POST

4.reuqest.is_ajax()是判斷當前請求是否是ajax請求,返回布林值

前端ajax

<script>
    $('#d1').click(function (){
        $.ajax({
            url:'',  # 朝哪發資料
            type:'post',  # 指定請求方式
            contentType:'application/json',  # 指定編碼格式
            data:JSON.stringify({'username': 'jason', 'pwd': 123}),  # 序列化成json格式
            success:function (args){

            }
        })
    })
</script>

後端接收資料

    if request.is_ajax():
        if request.method == 'POST':
            dic_json = request.body  # body接收的資料是二進位制格式
            dic = json.loads(dic_json)  # json特點:自動解碼並且反序列化(可以減少一步操作)
            print(dic)  

ajax傳送檔案

條件: ajax傳送檔案需要藉助於js內建物件FormData

前端ajax

<p>username:<input type="text" id="d1"></p>
<p>password:<input type="text" id="d2"></p>
<p>file: <input type="file" id="d3"></p>
<button class="btn btn-primary" id="d4">點我</button>

<script>
    $('#d4').on('click', function (){
        // 1.需要先利用FormData內建物件
        let formDataObj = new FormData()
        // 2.新增普通鍵值對
        formDataObj.append('username', $('#d1').val())
        formDataObj.append('password', $('#d2').val())
        // 3.新增檔案物件
        formDataObj.append('myfile', $('#d3')[0].files[0])
        // 4.將物件基於ajax傳送給後端
        $.ajax({
            url:'',
            type:'post',
            data:formDataObj, // 直接將物件放在data後面即可
            // 5.ajax傳送檔案必須要指定兩個引數
            contentType:false,  // 告訴瀏覽器不要修改提交的資料格式
            processData:false,  // 告訴瀏覽器不要對提交的資料進行任何的更改
            success:function (args){
            }
        })
    })
</script>

後端接收檔案

def file(request):
    if request.method == 'POST':
        print(request.POST)
        print(request.FILES)
        file_obj = request.FILES.get('myfile')
        print(file_obj.name)
    return render(request, 'file.html')

django自帶的序列化元件

在前後分離的專案中,不能使用模板語法,只能用過json格式來實現資料的互動,一般資料的組成都是列表套字典

手動

def drf(request):
    from django.http import JsonResponse
    user_queryset_list = models.User.objects.all()
    # 不用元件手動的新增字典
    user_list = []
    for user_obj in user_queryset_list:
        temp = {
            'pk': user_obj.pk,
            'username': user_obj.username,
            'age': user_obj.age,
            'sex': user_obj.get_sex_display(),
        }
        user_list.append(temp)
    return JsonResponse(user_list, safe=False, json_dumps_params={'ensure_ascii': False})

元件序列化

def drf(request):
    from django.http import JsonResponse
    from django.core import serializers
    user_queryset_list = models.User.objects.all()
    # 序列化
    res = serializers.serialize('json', user_queryset_list) # 指定json格式 然後傳入資料
    return JsonResponse(res, safe=False)
 """會自動幫你將資料變成json格式的字串 並且內部非常的全面"""
    
前後端分離的專案
作為後端開發的你只需要寫程式碼將資料處理好
能夠序列化返回給前端即可 
再寫一個介面文件 告訴前端每個欄位代表的意思即可

寫介面就是利用序列化元件渲染資料然後寫一個介面文件 該交代交代一下就完事

ajax結合sweetalert做彈窗效果

前端

"""
自己要學會如何拷貝
學會基於別人的基礎之上做修改
研究各個引數表示的意思 然後找葫蘆畫瓢
"""
下面style是為了處理一些顯示BUG
<style>
        div.sweetalert h2 {
            padding-top: 10px;
        }
</style>


<script>
    $('.del').on('click',function () {
        // 先將當前標籤物件儲存起來
        let currentBtn = $(this);
        // 二次確認彈框
        swal({
          title: "你確定要刪嗎?",
          text: "你可要考慮清除哦,可能需要拎包跑路哦!",
          type: "warning",
          showCancelButton: true,
          confirmButtonClass: "btn-danger",
          confirmButtonText: "是的,老子就要刪!",
          cancelButtonText: "算了,算了!",
          closeOnConfirm: false,
          closeOnCancel: false,
          showLoaderOnConfirm: true
        },
        function(isConfirm) {
          if (isConfirm) {
                // 朝後端傳送ajax請求刪除資料之後 再彈下面的提示框
                $.ajax({
                    {#url:'/delete/user/' + currentBtn.attr('delete_id'),  // 1 傳遞主鍵值方式1#}
                    url:'/delete/user/',  // 2 放在請求體裡面
                    type:'post',
                    data:{'delete_id':currentBtn.attr('delete_id')}, 
                    success:function (args) {  // args = {'code':'','msg':''}
                        // 判斷響應狀態碼 然後做不同的處理
                        if(args.code === 1000){
                            swal("刪了!", args.msg, "success");
                            // 1.lowb版本 直接重新整理當前頁面
                            {#window.location.reload()#}
                            // 2.利用DOM操作 動態重新整理
                            currentBtn.parent().parent().remove()
                        }else{
                            swal('完了','出現了位置的錯誤','info')
                        }
                    }

                })

          } else {
            swal("慫逼", "不要說我認識你", "error");
          }
        });
    })

</script>

後端

def delete(request):
    user_list = models.User.objects.filter(is_delete=0)
    if request.is_ajax():
        if request.method == 'POST':
            del_id = request.POST.get('id')
            models.User.objects.filter(pk=del_id).update(is_delete=1)
            back_dic = {'status': 200, 'msg': '刪除成功'}
            return JsonResponse(back_dic)
    return render(request, 'delete.html', locals())

這是顯示的BUG,按最上面的style改一下就好

最終版

總結

1.以後要獲取標籤內的屬性可以通過自定義的方式,不要侷限於標籤固有的屬性
用jqery物件.attr(屬性名)  就可以獲得到對應的屬性值
如果是獲取input框使用者輸入的資料 就用jqery物件.val()
2.還有一個設定點選事件的方法就是在標籤內部定義
eg:  <button onclick="del(可以傳參)">刪除</button>
    然後在<script>	  function del(引數){...}  </script>
3.標籤的id是不可重複的,可以用拼接的方式使id不重複
eg:  <a  onclick="del({{ user_obj.id }})" id="btn_{{ user_obj.id }}">刪除</a>
獲取標籤物件可以用拼接來獲取
<script>
function del(id){
	$('#btn_' + id )  // 這樣也是可以的  等價於  $('#btn_1') 、$('#btn_2')...
}
</script>

批量插入

格式: bulk_create

普通插入資料

def ab_pl(request):
   先給Book插入一萬條資料
    for i in range(10000):
        models.Book.objects.create(title='第%s本書'%i)
    # 再將所有的資料查詢並展示到前端頁面
    book_queryset = models.Book.objects.all()
    return render(request,'ab_pl.html',locals())

# 很慢  響應時間大概10s左右  還只是10000條資料

批量插入

批量插入
     book_list = []
     for i in range(100000):
         book_obj = models.Book(title='第%s本書' % i)
         book_list.append(book_obj)
     models.Book.objects.bulk_create(book_list)  # 批量插入資料 使用列表套物件
    return render(request,'ab_pl.html',locals())

# 用時3s 而且資料還是100000條