【问题标题】:Django POST stores everything in key instead of key-value pairDjango POST 将所有内容存储在键中而不是键值对中
【发布时间】:2020-06-09 04:28:03
【问题描述】:

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

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":""}] 
}>

我明白了

<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]":""}' : ''
}>

如您所见,在第二个中,整个集合被制成键,而不是一系列键值对。

如何确保我的对象正确映射到 POST 查询集?

编辑

发送的 JSON 字符串(带有格式以便于阅读):

{
"form1":{"field1":"","field2":"","field3":""},
"form2":{"field1":"","field2":"","field3":"","field4":""},
"form3":{"field1":"","field2":"","field3":"","field4":""},
"list_of_items":[{"item1":"", "item2":""]
}

编辑 2

XHR (Firefox) 的屏幕截图。请忽略 501 响应,即有意响应(暂时)

【问题讨论】:

  • 看看你的第二个输出,就好像你的前端发送了一个巨大的字符串而不是一个对象,这就是为什么 Django 将它变成一个键。您能否分享您的浏览器控制台中显示的 JSON/请求参数? (即在他们到达 Django 之前)
  • @JordanKowal 我已将生成的 JSON 字符串添加到帖子中。希望它是有用的。这是我使用 console.log() 时它在控制台中的显示方式
  • 您确定将其作为 JSON 而不是常规 POST 发送吗?
  • @AKX 是的。我也尝试过 $.post("add", JSON.stringify(data), "application/json") ,它做的完全一样。
  • 问题在于您的 POST 请求。您的对象看起来不错(如您的控制台中所示),但是当发布它时,它变成了一个巨大的字符串。尝试将您的代码与简单的 sn-ps 进行比较,看看您是否发现了什么:w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post2(如果您打开控制台并检查 XHR 请求,您会看到表单数据确实看起来像一个对象,而不是一个巨大的字符串)

标签: jquery django ajax post


【解决方案1】:

看看这篇文章。这是一个和你有同样问题的人,并设法解决它:Django's Querydict bizarre behavior: bunches POST dictionary into a single key

让我知道它是否有效

【讨论】:

  • 那个与python请求调用有关,我正在尝试通过jQuery发送消息,不,更改内容类型没有任何作用。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多