Django:即使密钥存在,将AJAX POST数据传递给Django也会产生MultiValueDictKeyError

mgP*_*ePe 5 python django ajax jquery post

我的Ajax调用中包含数据:

data: { hint: {'asdf':4} },
Run Code Online (Sandbox Code Playgroud)

我觉得我应该能够访问这个对象

request.POST['hint'] # and possibly request.POST['hint']['asdf'] to get 4
Run Code Online (Sandbox Code Playgroud)

但这个错误会妨碍你.我看着

MultiValueDictKeyError at /post_url/
"'hint'"
Run Code Online (Sandbox Code Playgroud)

当我打印帖子数据时,我得到了奇怪的错误字典:

<QueryDict: {u'hint[asdf]': [u'4']}>
Run Code Online (Sandbox Code Playgroud)

我应该如何正确传递数据,所以我在Python中保留了相同的结构并使用它与我在JS中的方式相同?

huu*_*huu 10

首先,在您的$.ajax调用中,不是直接将所有POST数据放入data属性中,而是将其添加到名称为的另一个属性中json_data.例如:

data: { hint: {'asdf':4} },
Run Code Online (Sandbox Code Playgroud)

应成为:

data: { json_data: { hint: {'asdf':4} } },
Run Code Online (Sandbox Code Playgroud)

现在,json_data应该使用以下方法将其转换为纯字符串JSON.stringify:

data: { json_data: JSON.stringify({ hint: {'asdf':4} }) },
Run Code Online (Sandbox Code Playgroud)

这会将数据作为字符串传递给Django,可以通过以下方式检索:

data_string = request.POST.get('json_data')
Run Code Online (Sandbox Code Playgroud)

可以转换为类似dict的对象(假设在顶部json导入import json):

data_dict = json.loads(data_string)
Run Code Online (Sandbox Code Playgroud)

或者,没有中间体data_string:

data_dict = json.loads(request.POST.get('json_data'))
print data_dict['hint']['asdf'] # Should print 4
Run Code Online (Sandbox Code Playgroud)