【问题标题】:django flatten dictionaries in ajax get / postdjango在ajax get / post中展平字典
【发布时间】:2015-08-15 02:19:35
【问题描述】:

我正在尝试通过 get/post 向 django 发送简单的 ajax 请求(没关系),似乎 django 在解析请求时会压扁字典。

举例:

我在 ajax 中发送给 django 的内容(通过 jquery):

{'payload':{'website':'localhost.com'}}

我在 django 端的 request.post 中得到了什么:

{u'payload[website]': [u'localhost.com']}

为什么?

谢谢,

编辑: 添加了 jquery 调用

$.ajax({
    type: "GET",
    url: full_url,
    data: {'payload': {'website': 'localhost.com'}},
    dataType: "json",
    contentType: "application/json",
    async: true,
    timeout: 5000,
});

【问题讨论】:

  • 实际上是 jquery 把字典弄平了。您不能通过 ajax 发送“字典”,只能发送纯文本。您可以将对象编码为 json 格式的文本,或表单数据(默认情况下,这里似乎发生了什么)或 xml 或任何内容
  • 你发送到 django 服务器的内容类型是什么?它应该设置为:'application/json'
  • @jumojer "json" 和 "application/json" 返回相同的结果。
  • @Anentropic 我将数据作为 json 发送,所以 jquery 应该在内部执行 JSON.stringify。我也尝试以纯文本形式发送并自己进行字符串化,结果略有不同: {u'{"payload":{"website":"localhost.com"}}': [u'']}
  • contentType 应该是 application/x-www-form-urlencodedmultipart/form-data: api.jquery.com/jQuery.ajax

标签: jquery python ajax django


【解决方案1】:

您发送到 django 服务器的内容类型是什么? 它应该设置为:'application/json',以便服务器知道它正在接收 json。 另外,尝试使用 request.data 而不是 data.post 来检索数据。 然后,您应该能够执行以下操作:

if (request.data):
   payload = request.data['payload']

快速说明,如果您传递给服务器的只是这些,我将删除一个级别,并且只发送内部字典,如下所示:

{'website':'localhost.com'}

然后用

检索它
request.data['website']

【讨论】:

  • 感谢您的回复。内容类型已经是 'application/json' :/ 将 ajax 调用添加到原始问题。
最近更新 更多