Django 2.1.7 ajax數組傳遞和後台接收
- 2019 年 10 月 5 日
- 筆記
存在問題
在前端有時候需要傳遞一個二維數組到後端,但是傳遞的情況可能會是這樣,如下圖:
![](https://ask.qcloudimg.com/http-save/yehe-2441724/ovt50epyg3.png)
此時,如果在django後端使用request.POST.get('users_rate')
來獲取值,獲取到的結果會是None,無法獲取到結果。
在查詢資料的過程中,有人在ajax請求中增加traditional:true,//防止深度序列化
,修改請求內容如下:
// 設置任務信息 var task_info = { 'tag': 'submit', // 提交表單標識 'task_name': $('#task_name').val(), 'task_priority': $('#task_priority').val(), 'service_url': $('#service_url').val(), 'run_time': $('#run_time').val(), 'expect_slaves': $('#expect_slaves').val(), 'users_rate':users_rate, }; // 發送ajax提交表單信息,創建任務 $.ajax({ url: "/tasks_manager/create_task", type: 'POST', headers: {"X-CSRFToken": Cookies.get('csrftoken')}, // 從Cookie取csrf_token,並設置ajax請求頭 data:task_info, dataType: "json", traditional:true,//防止深度序列化 async: false, // 請求成功調用的函數 success: function(res){ console.log(res); }, // 請求出錯時調用的函數 error:function(){ alert("提交創建任務失敗"); } });
可是這樣並不能解決問題,在django後端的確可以接手到了結果,但是獲取的值將會是[object Object]
。 網絡請求的Form Data截圖如下:
![](https://ask.qcloudimg.com/http-save/yehe-2441724/1lode6q4am.png)
解決問題
前端將要傳入的數組進行json格式化
使用JSON.stringify(users_rate)
對數組進行json序列化。 修改傳送數據的格式如下:
![](https://ask.qcloudimg.com/http-save/yehe-2441724/880jvueag3.png)
此時,再次進行ajax請求,查看網絡請求中的Form Data,如下:
![](https://ask.qcloudimg.com/http-save/yehe-2441724/qgzzbm02gj.png)
在後台通過request.POST.get('users_rate'),獲取到一個列表字符串,如下:
![](https://ask.qcloudimg.com/http-save/yehe-2441724/b31a28bhv0.png)
# todo: 獲取提交創建任務的form表單信息,創建任務 if tag == 'submit': print("submit") # todo:獲取任務的基本信息 users_rate = request.POST.get('users_rate') print('users_rate = ', users_rate)
前端完整ajax請求示例
// 獲取並發用戶數據 users_rate = []; // 並發用戶數據 $('.users-rate-list .data-table tbody').find('tr').each(function () { users_rate.push({ 'users': $(this).find('.users h5 span').text(), 'rate': $(this).find('.rate h5 span').text(), }); }); // 設置任務信息 var task_info = { 'tag': 'submit', // 提交表單標識 'task_name': $('#task_name').val(), 'task_priority': $('#task_priority').val(), 'service_url': $('#service_url').val(), 'run_time': $('#run_time').val(), 'expect_slaves': $('#expect_slaves').val(), 'users_rate':JSON.stringify(users_rate), }; // 發送ajax提交表單信息,創建任務 $.ajax({ url: "/tasks_manager/create_task", type: 'POST', headers: {"X-CSRFToken": Cookies.get('csrftoken')}, // 從Cookie取csrf_token,並設置ajax請求頭 data:task_info, dataType: "json", async: false, // 請求成功調用的函數 success: function(res){ console.log(res); }, // 請求出錯時調用的函數 error:function(){ alert("提交創建任務失敗"); } });