2017-07-19 84 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'需要添加才能访问上面的成功数据。