简体   繁体   English

Django JsonResponse不返回任何数据

[英]Django JsonResponse return no data

I'm subclassing Django UpdateView to update my model using AJAX form (based on Django 1.11 and jQuery-3.2.1). 我将Django UpdateView子类化,以使用AJAX表单(基于Django 1.11和jQuery-3.2.1)更新模型。

I want to change the UpdateView to return JSON data (instead of HttpResponseRedirect() or rendering form again with render_to_response()) 我想更改UpdateView以返回JSON数据(而不是HttpResponseRedirect()或使用render_to_response()再次呈现表单)

Here's my UpdateView's subclass looks like: 这是我的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)

Here's the URL setup for my UpdateView : 这是我的UpdateView的URL设置:

urlpatterns = [
    ...,
    url(r'^mediaset/(?P<pk>[0-9]+)/$', views.MediaSetUpdateView.as_view(), name='mediaset_update'),
    ...,
]

And here's my jQuery AJAX POST: 这是我的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);
    }
});

The django UpdateView returns success ('Data is saved' is printed in my django console), but there's no message that is returned (console.log(data) in AJAX success() return 'undefined'). django UpdateView返回成功(在我的django控制台中打印了“已保存数据”),但是没有返回任何消息(AJAX success()中的console.log(data)返回“ undefined”)。

Further investigation from my browser indicates that Django didn't return any message, other than HTTP success status. 根据我的浏览器的进一步调查表明,除了HTTP成功状态外,Django没有返回任何消息。 Here's capture from my chrome's debugger: 这是我的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

Any idea how to debug the lost data from JsonResponse? 任何想法如何调试从JsonResponse丢失的数据?

Based on Daniel Roseman, here's my code to send status/error message to AJAX form in Django view 基于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')

Then the jQuery AJAX is: 然后,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>');
    }
});

Note that 'jQuery.ajaxSettings.traditional = true' need to be added in order to access the success data like above. 请注意,需要添加“ jQuery.ajaxSettings.traditional = true”才能访问上述成功数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM