首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能将相对复杂的JS对象发布到Django视图中?

为什么我不能将相对复杂的JS对象发布到Django视图中?
EN

Stack Overflow用户
提问于 2014-05-22 12:18:11
回答 2查看 562关注 0票数 0

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

JavaScript

代码语言: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
    });

视图

代码语言:javascript
运行
复制
@require_AJAX
@require_POST
def get_bacon(request):
    datas = request.POST
    print datas
    response = HttpResponse('asdf', status=200)
    return response

输出

代码语言:javascript
运行
复制
<QueryDict: {u'2[]': [u'4', u'8', u'15', u'16', u'23', u'42'],
             u'csrfmiddlewaretoken': [u'B4micC9PgcT5jCP0WLef0ZLY9DICuH8Z']}>

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

问题

它在oDatas['2'] = 'foobar';中确实很好。我错过了什么?

相关答案

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

在我的例子中,使用'2[]'作为数据的密钥。不过听起来确实很恶心。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-22 19:26:47

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

代码语言:javascript
运行
复制
datas = dict(request.POST.iterlists())
datas.pop('csrfmiddlewaretoken')

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

然后,datas字典就是这样一个Python:

代码语言:javascript
运行
复制
{ 'foods[joe][]':   [ 'bacon', 'chicken', ],
  'foods[clara][]': [ 'lettuce', 'yogurt', 'oreo', ], }
票数 0
EN

Stack Overflow用户

发布于 2014-05-22 12:29:38

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

代码语言:javascript
运行
复制
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对象:

代码语言:javascript
运行
复制
import json

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

编辑:对不起,我忘了提到,您将不得不在ajax调用中压缩您的数据。

代码语言:javascript
运行
复制
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
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23806613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档