为什么我不能把相对复杂的JS对象放到我的Django视图中?

Why can't I post relatively complex JS objects to my Django view?

本文关键字:我的 Django 视图 对象 JS 不能 相对 复杂 为什么      更新时间:2023-09-26

使用Django 1.5.5,我试图使用$.post发布一个JS对象到我的视图。

JavaScript

var oDatas = { 'csrfmiddlewaretoken': $.cookie('csrftoken') };
oDatas['2'] = [ '4', '8', '15', '16', '23', '42' ];
$.post('/my/ajax/url/', oDatas)
    .done(function(oResponse, sStatus, oXHR) {
        // Handling successful request
    })
    .fail(function(oXHR, sStatus, sErrorThrown) {
        // Handling failed request
    });
<<h3>视图/h3>
@require_AJAX
@require_POST
def get_bacon(request):
    datas = request.POST
    print datas
    response = HttpResponse('asdf', status=200)
    return response

输出
<QueryDict: {u'2[]': [u'4', u'8', u'15', u'16', u'23', u'42'],
             u'csrfmiddlewaretoken': [u'B4micC9PgcT5jCP0WLef0ZLY9DICuH8Z']}>

注意键实际上是'2[]'

问题

它确实工作与oDatas['2'] = 'foobar';。我错过了什么?


相关SO答案

  • https://stackoverflow.com/a/18046286/1824222

您可以尝试使用tasks[]而不是通过ajax发送任务作为参数

在我的情况下,使用'2[]'作为我的数据的键。不过听起来确实很恶心。

尝试通过body属性访问它。文档

def get_bacon(request):
    if request.is_ajax() and request.method == 'POST':
        datas = request.body
    else: 
        datas = request.POST
    print datas
    response = HttpResponse('asdf', status=200)
    return response

您可能必须解析json对象如下:

import json
def get_bacon(request):
    datas = json.loads(request.body)

编辑:对不起,我忘了说,您必须在ajax调用中对数据进行字符串化。

var oDatas = { 'csrfmiddlewaretoken': $.cookie('csrftoken') };
oDatas['2'] = [ '4', '8', '15', '16', '23', '42' ];
$.post('/my/ajax/url/', JSON.stringify(oDatas))
    .done(function(oResponse, sStatus, oXHR) {
        // Handling successful request
    })
    .fail(function(oXHR, sStatus, sErrorThrown) {
        // Handling failed request
    });

我想我的问题是。request.POST在这里是一个QueryDict对象。Django(1.5.5),扁平化任何相对复杂的 - read 嵌套的 - JS对象。

datas = dict(request.POST.iterlists())
datas.pop('csrfmiddlewaretoken')

注意,我使用iterlists只是因为我的QueryDict对象包含列表。否则请使用iteritems

那么datas字典就是这样的Python字典:

{ 'foods[joe][]':   [ 'bacon', 'chicken', ],
  'foods[clara][]': [ 'lettuce', 'yogurt', 'oreo', ], }