我正在发送一个创建新用户的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
答案 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
})