如何使用XHR通过POST将数据作为键 - 值对而不是字符串发送

时间:2012-10-11 08:44:16

标签: django post xmlhttprequest angularjs

我正在创建两个POST调用。一个使用django形式,一个使用角js通过资源xhr。

角度设置如下所示:

myModule.factory('gridData', function($resource) {
    //define resource class
    var root = {{ root.pk }};
    var csrf = '{{ csrf_token }}';
    return $resource('{% url getJSON4SlickGrid root.pk %}:wpID/', {wpID:'@id'},{
            get: {method:'GET', params:{}, isArray:true},
            update:{method:'POST', headers: {'X-CSRFToken' : csrf }}
    });
});

创建xhr post请求:

item.$update();

此帖子请求按预期发送到服务器,但是当我想访问QueryDict时,我无法访问使用的传递数据:

name = request.POST.get('name', None)

name始终是None

这背后的问题是QueryDict对象被解析得很奇怪。

 print request.POST
<QueryDict: {u'{"name":"name update","schedule":0"}':[u'']}>

我希望这个结果是我通过“正常”的Post请求发送数据时得到的结果:

<QueryDict: {u'name': [u'name update'], u'schedule': [u'0']}>

所以似乎Django在POST请求中收到一些东西,指示Django将参数解析为一个字符串。知道如何规避这个吗?

更新

我发现了this讨论,他们说问题是如果你提供除MULTIPART_CONTENT之外的任何内容类型,参数将被解析为一个字符串。我使用POST请求检查了内容类型发送,它确实设置为'CONTENT_TYPE': 'application/json;charset=UTF-8'。因此,这可能是问题所在。因此,我的问题是:如何将使用angular.js资源创建的xhr post请求的CONTENT_TYPE设置为MULTIPART_CONTENT

1 个答案:

答案 0 :(得分:5)

你可以:

  • 将客户提升为send data instead of json
  • 使用json.loads(request.raw_post_data).get('name', None)(django&lt; 1.4)
  • 使用json.loads(request.body).get('name', None)(django&gt; = 1.4)

Angular文档讨论了transforming requests and responses

  

要在本地覆盖这些转换,请将转换函数指定为配置对象的transformRequest和/或transformResponse属性。要全局覆盖默认转换,请覆盖$ httpProvider的$ httpProvider.defaults.transformRequest和$ httpProvider.defaults.transformResponse属性。

你可以找到一个例子here,如前所述。

相关问题