【问题标题】:Handling ajax json object in Django - 'QueryDict' object has no attribute 'read' error在 Django 中处理 ajax json 对象 - 'QueryDict' 对象没有属性 'read' 错误
【发布时间】:2016-09-30 21:12:39
【问题描述】:

我正在尝试在我的 Django 视图中解析 json 对象,该对象已通过 ajax 通过 post 方法从客户端传递。

JS:

$.post ('/update_vendor_merchandise_types/', JSON.stringify(json_obj));

查看:

def update_vendor_merchandise_types(request):
    print json_object
    # The output gives me  
    # QueryDict: <QueryDict: {u'[{"merchandise_id":"3"},{"merchandise_id":"4"}]': [u'']}>
    json_object = json.load(request.POST) # Error arises
pass

在注释行出现'QueryDict' object has no attribute 'read' error。 我做错了什么?

最终,我的目标是获取商品 ID 值。我试试

d = request.POST.iteritems()
for key, value in d:
    print value

并期待像

3 
4

【问题讨论】:

  • 您可以使用json.load 将 json 格式转换为 dict。在这里,您有一个要转换为json 的字典。你会做json.dumps(request.POST.copy())
  • 你到底想做什么? request.POST 是一个字典,它应该包含您实际需要的任何数据,没有任何意义 jsonifying 它
  • 我已经编辑了这个问题。请查看 json_object 的值。我正在尝试遍历它。比如说,打印所有的mercurial_id和各自的value值

标签: jquery python json ajax django


【解决方案1】:

request.POST 用于表单编码的内容。对于 JSON,您应该直接访问普通正文:

json_object = json.loads(request.body)

【讨论】:

  • Daniel,我将您的答案标记为解决方案,因为您的选项将 json 转换为 python 列表,结果证明最简单的循环方式 (d = json.loads(request.body) for x in d: print x[ 'merchandise_id'])。 @Eduard,您建议的方法也有效。
  • 丹尼尔,你能看到这个问题吗?
【解决方案2】:

json_obj 发送到服务器时为什么要转成字符串?我认为你应该这样做:

json_obj = {"key1": "value1", "key2": "value2"}
$.post('/update_vendor_merchandise_types/', json_obj)  

在这种情况下,在服务器端,您可以通过这种方式访问​​发送的数据:

v1 = request.POST["key1"]

【讨论】:

  • Eduard,实际上,我希望循环的代码尽可能通用,并且我想避免通过字段名称来寻址 json 元素。相反,我的最终目标是遍历它
  • 可能你的json_obj应该是这样的:{"merchandise_ids": ["3", "4"]},在这种情况下你可以通过执行ids = request.POST["merchandise_ids"]在服务器上获取商品ID列表
猜你喜欢
  • 2011-06-23
  • 2020-07-05
  • 2021-02-22
  • 1970-01-01
  • 2015-10-13
  • 2020-02-15
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多