【问题标题】:Why can't I post relatively complex JS objects to my Django view?为什么我不能将相对复杂的 JS 对象发布到我的 Django 视图中?
【发布时间】:2014-07-11 11:28:54
【问题描述】:

使用 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
    });

查看

@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 答案

通过ajax发送时可以尝试使用tasks[]代替tasks作为参数

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

【问题讨论】:

    标签: javascript jquery json django post


    【解决方案1】:

    尝试通过body 属性访问它。 Docs

    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.body 返回一个带有转义字符的字符串化对象。当我将它传递给json.loads 时,我得到ValueError: Extra data: line 1 column 2 - line 1 column 117 (char 1 - 116)。
    • 啊,这比我的解决方案干净多了。我想知道request.POST.getlist(key) 是否适合你。
    • 是吗?更改我的 JS 对象键并为每个深度级别添加一组大括号对我来说看起来很脏。
    • 老实说,我没有看链接的答案。我刚刚看到你有一个答案,那就是使用 '2[]' 作为键。
    • 是的,就是这样。但我实际的oDatas 并不像我原来的帖子中描述的那样简单(它实际上是一个包含我的CSRF 令牌和另一个对象的对象)。并且将 'foo[bar][]' 作为我的 Python 字典的键并不是很方便使用(bar 部分对应于我发布的父对象中对象的所有键。不知道这是否足够清楚,英语不是我的母语。
    【解决方案2】:

    想通了我正在苦苦挣扎的是。 request.POST 在这里是一个 QueryDict 对象。 Django (1.5.5),扁平化任何相对复杂 - 读取嵌套 - JS 对象。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 2010-12-04
      • 2014-07-27
      • 1970-01-01
      相关资源
      最近更新 更多