Tastypie ajax POST obj_create - 如何返回json

时间:2012-03-29 20:16:30

标签: django tastypie

我正在发送一个创建新用户的POST,并且有效。

我的问题是我如何取回创建用户的pk到ajax响应?

         $.ajax({
                url: 'http://localhost:8080/api/v1/create/user/',
                type: 'POST',
                contentType: 'application/json',
                data: '{"uuid": "12345"}',
                dataType: 'json',
                processData: false,
                success: function (r) {
                    console.log(r)
                },
            });

def obj_create(self, bundle, request=None, **kwargs):
        try:
            user = User.objects.create_user(bundle.data['uuid'],'1')
            user.save()


        except:
            pass
        return bundle

3 个答案:

答案 0 :(得分:8)

您可以在UserResource的always_return_data=True中设置Meta,在POST和PUT请求中它将返回创建的对象。

来自docs

  

always_return_data

     

指定所有HTTP方法(DELETE除外)应返回数据的序列化形式。默认值为False。

     

如果为False,则在POST / PUT上返回HttpNoContent(204),其中空体&请求完整资源的位置标题。

     

如果为True,则在POST / PUT上返回HttpAccepted(202),其中一个正文包含序列化形式的所有数据。

答案 1 :(得分:1)

每种资源都有脱水方法。您可以使用它来添加任何数据以进行响应。以下是文档 - http://django-tastypie.readthedocs.org/en/latest/cookbook.html#adding-custom-values

答案 2 :(得分:1)

您可以使用Location标头(默认情况下由Tastypie设置),也可以尝试让Tastypie重新发送新创建的实体。我相信第一个更简单。您还可以查看相关的SO问题:Is it ok by REST to return content after POST?

首先,您需要稍微修改jQuery XHR对象,

// Required for reading Location header of POST responses.
var _super = $.ajaxSettings.xhr;
$.ajaxSetup({
    xhr: function () {
        var xhr = _super();
        var getAllResponseHeaders = xhr.getAllResponseHeaders;
        xhr.getAllResponseHeaders = function () {
            var allHeaders = getAllResponseHeaders.call(xhr);
            if (allHeaders) {
                return allHeaders;
            }
            allHeaders = "";
            $(["Cache-Control", "Content-Language", "Content-Type", "Expires", "Last-Modified", "Pragma", "Location"]).each(function (i, header_name) {
                if (xhr.getResponseHeader(header_name)) {
                    allHeaders += header_name + ": " + xhr.getResponseHeader(header_name) + "\n";
                }
            });
            return allHeaders;
        };
        return xhr;
    }
});

这是必需的,因为(after jQuery $.ajax docs):

  

目前,由于Firefox中的一个错误,.getAllResponseHeaders()返回空字符串,尽管.getResponseHeader('Content-Type')返回非空字符串,不支持在Firefox中使用jQuery自动解码JSON CORS响应

     

通过重写jQuery.ajaxSettings.xhr可以解决此问题,如下所示:

然后你可以读取successCallback中的标题,如下所示:

successCallback: errorAwareCall(function (data, t, textStatus, XMLHttpRequest) {
    var loc = XMLHttpRequest.getAllResponseHeaders();
    var pk = parseInt(loc.match(/\/(\d+)(\/)*/)[1]);
    // Do something with the PK
})