Jquery Django POST将所有内容存储在键中,而不是键值对中

Jquery Django POST将所有内容存储在键中,而不是键值对中,jquery,django,ajax,post,Jquery,Django,Ajax,Post,我正在尝试一次性发布多个表单数据(是的,它们需要作为一个发布内容发布。不,这是不能更改的。甚至不要建议多次提交。)并且我可以构建正确类型的对象 convert_to_object是一个自定义函数,用于将序列化数组转换为具有正确键值对的对象 save_button.click(function(){ //Collect information console.log("Collecting form data"); var data = {}; da

我正在尝试一次性发布多个表单数据(是的,它们需要作为一个发布内容发布。不,这是不能更改的。甚至不要建议多次提交。)并且我可以构建正确类型的对象

convert_to_object是一个自定义函数,用于将序列化数组转换为具有正确键值对的对象

save_button.click(function(){
      //Collect information
      console.log("Collecting form data");
      var data = {};
      data.form1= convert_to_object($("[data-formtype='form1']").serializeArray());
      data.form2= convert_to_object($("[data-formtype='form2']").serializeArray());
      data.form3= convert_to_object($("[data-formtype='form3']").serializeArray());

      var items= []; 
      forms_list.forEach(form_in_list=> {
        items.push(convert_to_object(form_in_list.serializeArray()));
      });

      data.list_of_items = items;


      //Send our data object to our endpoint
      $.post("add", data)
      .done(function(data, status){
          //Success handling
      })
      .fail(function(data, status){
          //Failure handling
      })

    });
这将创建正确的JavaScript对象,该对象具有正确形状的所有值,我可以将其转换为JSON字符串

问题是,当我将这个JSON字符串发送给Django时,我在request.POST中没有得到键值对,而是将整个JSON字符串作为键,将值作为空字符串。所以不是

<QueryDict: {
    "form1":{"field1":"","field2":"","field3":""},
    "form2":{"field1":"","field2":"","field3":"","field4":""},
    "form3":{"field1":"","field2":"","field3":"","field4":""},
    "list_of_items":[ {"item1":"", "item2":""}] 
}>
编辑2

XHR(Firefox)的屏幕截图。请忽略501响应,这是有意的响应(目前)
查看这篇文章。这是一个与您有相同问题的人,并设法解决了该问题:


让我知道它是否有效

多亏@Jordan Kowal,我才能够解决这个问题。问题是数据是作为字符串而不是对象发送的。在确保变量保持为对象后,我能够正确加载数据


尽管我还发现,您可以将整个内容作为JSON字符串发送,然后从request.body加载,这会给您一个可以轻松处理的dict。

查看第二个输出,就好像您的前端发送了一个巨大的字符串,而不是一个对象,因此Django将其转换为一个键。您能否共享浏览器控制台中显示的JSON/请求参数?(即在他们到达Django之前)@JordanKowal我已将生成的JSON字符串添加到帖子中。希望它有用。这就是当我使用console.log()时,它在控制台中的显示方式。您确定要以JSON而不是常规帖子的形式发送它吗?@AKX是的。我也尝试过$.post(“add”,JSON.stringify(data),“application/JSON”),它做了完全相同的事情。您的对象看起来很好(如控制台中所示),但当发布它时,它会变成一个巨大的字符串。尝试将您的代码与简单的代码片段进行比较,看看您是否发现了什么:(如果打开控制台并检查XHR请求,您将看到表单数据看起来确实像一个对象,而不是一个巨大的字符串)其中一个与python请求调用相关,我正在尝试通过jQuery发送消息,不,更改内容类型没有任何作用。
<QueryDict: 
'{"form1[field1]":[""],"form1[field2]":[""],"form1[field3]":[""],"form2[field1]":[""],"form2[field2]":[""],"form2[field3]":[""],"form2[field4]":[""]},"form2[field1]":["]","form2[field2]":[""],"form2[field3]":[""],"form2[field4]":[""]},"list_of_items[0][item1]":"","list_of_items[0][item2]":""}' : ''
}>
{
"form1":{"field1":"","field2":"","field3":""},
"form2":{"field1":"","field2":"","field3":"","field4":""},
"form3":{"field1":"","field2":"","field3":"","field4":""},
"list_of_items":[{"item1":"", "item2":""]
}