Django 2.1.7 ajax数组传递和后台接收

  • 2019 年 10 月 5 日
  • 筆記

存在问题

在前端有时候需要传递一个二维数组到后端,但是传递的情况可能会是这样,如下图:

此时,如果在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截图如下:

解决问题

前端将要传入的数组进行json格式化

使用JSON.stringify(users_rate)对数组进行json序列化。 修改传送数据的格式如下:

此时,再次进行ajax请求,查看网络请求中的Form Data,如下:

在后台通过request.POST.get('users_rate'),获取到一个列表字符串,如下:

            # 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("提交创建任务失败");      }  });