2017-07-19 76 views
0

我正在繼承Django UpdateView以使用AJAX表單(基於Django 1.11和jQuery-3.2.1)更新我的模型。Django JsonResponse不返回數據

我想改變的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

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); 
    } 
}); 

的UpdateView返回成功Django的(「數據保存」被印在了我的Django控制檯),但沒有被返回(消息的console.log(數據)在AJAX成功()返回'未定義')。

從我的瀏覽器進一步調查表明,除了HTTP成功狀態,Django沒有返回任何消息。這裏是我的鉻調試器捕獲:

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

正如消息所述,204是「無內容」。你爲什麼使用這種狀態?爲什麼不是200(OK)或201(創建)? –

+0

另請注意,使用特定ID更新內容的請求的正確HTTP動詞是PUT,而不是POST。 –

+0

最後,如果你這樣做,你應該真正調查django-rest-framework而不是黑客Django自己的觀點。 –

回答

0

根據丹尼爾·羅斯曼,這裏是我的代碼發送狀態/錯誤消息AJAX形式在Django視圖

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'需要添加才能訪問上面的成功數據。