【发布时间】: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
【问题讨论】:
-
看看你的第二个输出,就好像你的前端发送了一个巨大的字符串而不是一个对象,这就是为什么 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 请求,您会看到表单数据确实看起来像一个对象,而不是一个巨大的字符串)