Django JsonResponse没有返回任何数据

时间:2017-07-19 09:55:30

标签: jquery ajax django

我将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调试丢失的数据吗?

1 个答案:

答案 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;需要添加才能访问上述成功数据。