Jquery Django JsonResponse不返回任何数据
我正在子类化DjangoUpdateView以使用AJAX表单(基于Django 1.11和jQuery-3.2.1)更新我的模型 我想更改UpdateView以返回JSON数据(而不是HttpResponseRedirect()或使用render\u to\u response()再次呈现表单) 下面是我的更新视图的子类:Jquery Django JsonResponse不返回任何数据,jquery,ajax,django,Jquery,Ajax,Django,我正在子类化DjangoUpdateView以使用AJAX表单(基于Django 1.11和jQuery-3.2.1)更新我的模型 我想更改UpdateView以返回JSON数据(而不是HttpResponseRedirect()或使用render\u to\u response()再次呈现表单) 下面是我的更新视图的子类: class MediaSetUpdateView(UpdateView): def form_valid(self, form): self.obj
class MediaSetUpdateView(UpdateView):
def form_valid(self, form):
self.object = form.save()
print("Data is saved", file=sys.stderr)
return JsonResponse({'message' : 'Data is saved'}, status=204)
def form_invalid(self, form):
print("form invalid", file=sys.stderr)
return JsonResponse(form.errors.as_json(), status=422)
以下是我的更新视图的URL设置:
urlpatterns = [
...,
url(r'^mediaset/(?P<pk>[0-9]+)/$', views.MediaSetUpdateView.as_view(), name='mediaset_update'),
...,
]
django UpdateView返回success(“数据已保存”在我的django控制台中打印),但没有返回任何消息(AJAX success()中的console.log(Data)返回“undefined”)
从我的浏览器进一步调查表明,Django没有返回任何消息,除了HTTP成功状态。以下是我的chrome调试器的捕获:
HTTP/1.0 204 No Content
Date: Wed, 19 Jul 2017 09:28:09 GMT
Server: WSGIServer/0.2 CPython/3.5.2
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Length: 28
知道如何调试JsonResponse中丢失的数据吗 基于Daniel Roseman,下面是我在Django视图中将状态/错误消息发送到AJAX表单的代码
class MediaSetUpdateView(UpdateView):
def form_valid(self, form):
self.object = form.save()
#print("Data is saved", file=sys.stderr)
return JsonResponse({'message' : 'Data is saved'}, status=200)
def form_invalid(self, form):
#print("form invalid", file=sys.stderr)
return HttpResponse(form.errors.as_json(), status = 400, content_type='application/json')
那么jQuery AJAX是:
$.ajax({
url: ajax_url,
type: 'put', // Performing a PUT request
data : json_storage,
dataType: 'json',
success: function(data) {
console.log(data);
$('#id_save_dialog_message').remove();
$('#id_save_dialog .modal-dialog .modal-content .modal-body').prepend(
'<div id="id_save_dialog_message" class="alert alert-success">' + data['message'] + '</div>');
},
error: function(data) {
console.log(data);
errors = $.parseJSON(data.responseText);
error_msg = '';
$.each(errors, function (key, data) {
$.each(data, function (key_array, data) {
error_msg += '<div class="row"><div class="col-md-4">'+ key +
'(' + data['code'] + ')</div><div class="col-md-8">'
+ data['message'] + '</div></div>';
});
});
$('#id_save_dialog_message').remove();
$('#id_save_dialog .modal-dialog .modal-content .modal-body').prepend(
'<div id="id_save_dialog_message" class="alert alert-danger">' + error_msg + '</div>');
}
});
$.ajax({
url:ajax\uURL,
键入:“put”,//执行put请求
数据:json_存储,
数据类型:“json”,
成功:功能(数据){
控制台日志(数据);
$(“#id#save_dialog_message”).remove();
$('#id_save_dialog.modal dialog.modal content.modal body')。前缀(
''+数据['message']+'';
},
错误:函数(数据){
控制台日志(数据);
errors=$.parseJSON(data.responseText);
错误消息=“”;
$。每个(错误、功能(键、数据){
$.each(数据、函数(键数组、数据){
错误消息+=''+键+
“(”+数据['code']+')”
+数据['message']+'';
});
});
$(“#id#save_dialog_message”).remove();
$('#id_save_dialog.modal dialog.modal content.modal body')。前缀(
''+错误消息+'';
}
});
请注意,需要添加“jQuery.ajaxSettings.traditional=true”才能访问上述成功数据。如消息所述,204表示“无内容”。你为什么要用那种身份?为什么不是200(确定)或201(创建)?还要注意,请求使用特定ID更新内容的正确HTTP动词是PUT,而不是POST。最后,如果您这样做,您应该真正研究django rest框架,而不是攻击django自己的视图。有什么原因您甚至不想使用普通的基于函数的视图吗?非常感谢。我从某处复制并粘贴了它,从未意识到HTTP 204意味着“成功,没有返回数据”
$.ajax({
url: ajax_url,
type: 'put', // Performing a PUT request
data : json_storage,
dataType: 'json',
success: function(data) {
console.log(data);
$('#id_save_dialog_message').remove();
$('#id_save_dialog .modal-dialog .modal-content .modal-body').prepend(
'<div id="id_save_dialog_message" class="alert alert-success">' + data['message'] + '</div>');
},
error: function(data) {
console.log(data);
errors = $.parseJSON(data.responseText);
error_msg = '';
$.each(errors, function (key, data) {
$.each(data, function (key_array, data) {
error_msg += '<div class="row"><div class="col-md-4">'+ key +
'(' + data['code'] + ')</div><div class="col-md-8">'
+ data['message'] + '</div></div>';
});
});
$('#id_save_dialog_message').remove();
$('#id_save_dialog .modal-dialog .modal-content .modal-body').prepend(
'<div id="id_save_dialog_message" class="alert alert-danger">' + error_msg + '</div>');
}
});