在 Django 中处理 ajax json 对象 - 'QueryDict' 对象没有属性 'read' 错误

Posted

技术标签:

【中文标题】在 Django 中处理 ajax json 对象 - \'QueryDict\' 对象没有属性 \'read\' 错误【英文标题】: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值 【参考方案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,您建议的方法也有效。 丹尼尔,你能看到这个问题吗? ***.com/questions/37586305/…【参考方案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列表

以上是关于在 Django 中处理 ajax json 对象 - 'QueryDict' 对象没有属性 'read' 错误的主要内容,如果未能解决你的问题,请参考以下文章

Django中Ajax处理

Django之ajax

Django与Ajax

Django AJAX

Django 使用ajax上传文件

如何在 django 中验证 json 对象