2017-07-19 5 views
0

私はDjango UpdateViewをサブクラス化しています(Django 1.11とjQuery-3.2.1に基づく)。Django JsonResponse返信データなし

私はJSONデータを返すためにUpdateViewを変更したい((代わりに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) 

私のためのURL設定はです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のコンソールに印刷されて)成功を返しますが、(にconsole.log(データ)が返され何もメッセージはありませんAJAX success()は 'undefined'を返します)。

私のブラウザから詳しい調査を行ったところ、DjangoはHTTPの成功ステータス以外に何のメッセージも返していないことを示しています。ここに私のクロムのデバッガからのキャプチャです:

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

メッセージには、「No Content」と表示されています。なぜそのステータスを使用していますか?なぜ200(OK)か201(Created)はありませんか? –

+0

また、特定のIDでコンテンツを更新する要求の正しいHTTP動詞は、POSTではなくPUTです。 –

+0

最後に、これを行うなら、Django独自のビューをハッキングするのではなく、実際にdjango-rest-frameworkを調べるべきです。 –

答えて

0

が、ここでは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を追加する必要があります。

関連する問題