用Ajax传递dict的词典

时间:2016-06-08 09:23:11

标签: javascript jquery python ajax django

我正在开发一个运行在Django上的网站。 我需要使用Ajax将数据从Javascript传递给我的Python代码。

这是我的代码:

// Javascript file
   function myFunc() {
        {...} // Generate var 'values' which is a dict of dict {{},{}...}
        console.log(JSON.stringify(values));
        $.ajax({
                url : "holt/",
                type : "POST",
                data : values,
                success : function (json) {
                   console.log(json)
                },
                error : function () {
                    alert("Error Ajax");
                }
            })
    }

我在python中的观点:

  class getHolt(TemplateView):
        def get(self, request, *args, **kwargd):
            pass 
        def post(self, request, *args, **kwargd):
            if request.user.is_authenticated():
                data = dict(request.POST)
                h = Holt(data)
                response_data, success = h.get_holt(2021, no_freeze=True)
                return HttpResponse(
                    json.dumps(response_data),
                    content_type="application/json"
                )

然而,当我运行时,使用:

  

Javascript值

values= {
    "1":{"data_2013":"49105","data_2014":"92620","data_2015":"30000","data_2016":"1945000"},
    "2":{"data_2013":"2885906","data_2014":"2876120","data_2015":"2882653","data_2016":"2787520"},
    "3":{"data_2013":"29201124","data_2014":"29470635","data_2015":"29383195","data_2016":"30154361"}}

我在Python代码中收到了这个:

print request.POST
  

< QueryDict:{u'1 [data_2014]':[u'92620'],u'1 [data_2015]':   [u'30000'],u'3 [data_2013]':[u'29201124'],u'3 [data_2014]':   [u'29470635' ],...}>

print dict(request.POST)
  

{u'1 [data_2014]':[u'92620'],u'1 [data_2015]':   [u'30000'],u'3 [data_2013]':[u'29201124'],u'3 [data_2014]':   [u'29470635' ],...}

为什么我不接受像我发送的那样的dict dict?

Ajax在“发送”之前对数据做了什么?

谢谢

JS dictionnary

console.log(JSON.stringify(values));
   {"1":{"data_2013":"49105","data_2014":"92620","data_2015":"30000","data_2016":"1945000"},"2":{"data_2013":"2885906","data_2014":"2876120","data_2015":"2882653","data_2016":"2787520"},"3":{"data_2013":"29201124","data_2014":"29470635","data_2015":"29383195","data_2016":"30154361"}}

1 个答案:

答案 0 :(得分:7)

jquery会在通过ajax发送之前将你的js dict(它在js中称为object)分解为多个变量,所以在python端没有dict,基本上你不能从js传递一个字典到python通过ajax ...然而他们都理解json。

所以你需要在发送之前对你的dict进行json编码

   $.ajax({
            url : "holt/",
            type : "POST",
            data : { 'values' : JSON.stringify(values) } ,
            success : function (json) {
               console.log(json)
            },
            error : function () {
                alert("Error Ajax");
            }
        })

并在python视图中解码它们

dict_ = json.loads(request.POST.get('values'))
不过,如果你使用的是ajax,我强烈推荐使用firebug,所以可以看到whtas正在进行中