Tastypie AJAX POST obj_create - Как вернуть JSON - PullRequest
4 голосов
/ 30 марта 2012

Я отправляю сообщение 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 ]

8 голосов
/ 26 февраля 2013

вы можете установить always_return_data=True в Meta вашего UserResource, и по запросу POST и PUT он вернет созданный объект обратно.

Из документов

always_return_data

Указывает, что все методы HTTP (кроме DELETE) должны возвращать сериализованную форму данных. По умолчанию установлено значение False.

Если False, HttpNoContent (204) возвращается в POST / PUT с пустым телом и заголовком Location, где запрашивать полный ресурс.

Если True, HttpAccepted (202) возвращается в POST / PUT с телом, содержащим все данные в сериализованной форме.

1 голос
/ 30 марта 2012

Вы можете либо использовать заголовок Location (установленный Tastypie по умолчанию), либо вы можете попытаться заставить Tastypie отослать вновь созданную сущность обратно.Я считаю, что первый проще.Вы также можете взглянуть на соответствующий вопрос SO: Можно ли с помощью REST возвращать содержимое после 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;
    }
});

Это необходимо, потому что ( после jQuery $ .ajax docs ):

В настоящее время из-за ошибки в Firefox, где .getAllResponseHeaders () возвращает пустую строку, хотя.getResponseHeader ('Content-Type') возвращает непустую строку, автоматическое декодирование ответов JSON CORS в Firefox с помощью jQuery не поддерживается.

Обойти это можно, переопределив 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
})
1 голос
/ 30 марта 2012

Каждый ресурс имеет метод обезвоживания. Вы можете использовать его для добавления любых данных в ответ. Вот документы - http://django -tastypie.readthedocs.org / en / latest / cookbook.html # добавление-настраиваемые значения

...