簡體   English   中英

Django JsonResponse不返回任何數據

[英]Django JsonResponse return no data

我將Django UpdateView子類化,以使用AJAX表單(基於Django 1.11和jQuery-3.2.1)更新模型。

我想更改UpdateView以返回JSON數據(而不是HttpResponseRedirect()或使用render_to_response()再次呈現表單)

這是我的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的URL設置:

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丟失的數據?

基於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>');
    }
});

請注意,需要添加“ jQuery.ajaxSettings.traditional = true”才能訪問上述成功數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM