我将Django UpdateView 子类化为使用AJAX格式更新我的模型(基于Django 1.11和jQuery-3.2.1)。
我想更改 UpdateView 以使用render_to_response()再次返回JSON数据(而不是HttpResponseRedirect()或渲染表单)
这是我的 UpdateView的子类,如下所示:
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)
以下是 UpdateView 的网址设置:
urlpatterns = [
...,
url(r'^mediaset/(?P<pk>[0-9]+)/$', views.MediaSetUpdateView.as_view(), name='mediaset_update'),
...,
]
这是我的jQuery AJAX POST:
/* The global var to store current data */
var json_storage = {"template_id":1 };
$.ajax({
url: '/esignage/mediaset/6/',
type: 'post', // Performing a POST request
data : json_storage,
dataType: 'json',
success: function(data) {
console.log(data);
},
error: function(data) {
console.log(data);
}
});
django UpdateView返回成功(“保存数据”在我的django控制台中打印),但没有返回的消息(在AJAX success()中的console.log(data)返回'undefined')。
我的浏览器进一步调查表明,除了HTTP成功状态之外,Django没有返回任何消息。这是我的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调试丢失的数据吗?
答案 0 :(得分:1)
基于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>');
}
});
请注意&#39; jQuery.ajaxSettings.traditional = true&#39;需要添加才能访问上述成功数据。