2014-03-26 19 views
1

我有一個很長的formset顯示在頁面上。這是目前保存像這樣:如何使用jQuery自動保存django視圖?

if request.method == 'POST': 

    survey_formset = SurveyFormset(request.POST) 

    if survey_formset.is_valid(): 
     ss = SurveySet() 
     ss.user=request.user 
     ss.save() 
     for form in survey_formset.forms: 
      saved = form.save(commit=False) 
      saved.surveyset = ss 
      saved.save() 
     return HttpResponseRedirect('/') 

我怎樣才能使它所以整個surveyset獲取每個用戶在另一個輸入填充時間保存在後臺?

到目前爲止,這是我迄今爲止。我如何使用回調通過AJAX將內容發送到服務器?

<form action="" method="POST" id="surveyset">{% csrf_token %} 
     {{ survey_formset.management_form|crispy }} 

     <!-- A lot of inputs! --> 

      {% for form in survey_formset.forms %} 
       <hr> 
       <div id="survey-{{ forloop.counter }}" class='content'> 
       {% crispy form %} 
       </div> 
      {% endfor %} 

     <input id='save_set' type="submit" value="Submit" class='button' /> 
    </form> 

<!-- Time to autosave! --> 

<script type="text/javascript" src="{% static "js/jquery.autosave.js" %}"></script> 
<script> 
    $(document).ready(function() { 

     $("form").autosave({ 
     callbacks: { 
      trigger: ["change", function() { 
      var self = this; 

      $("#save_set").click(function() { 
       self.save(); 
      }); 

      }], 
      save: { 
      method: "ajax", 

      // What do I tell the django view? 
      // How do I silently save in the background? 

      options: { 
       success: function() { 
       console.log("saved!"); 
       } 
      } 
      } 
     } 
     }); 

    }); 
</script> 

我用這傢伙代碼:

https://github.com/nervetattoo/jquery-autosave

+0

您可能希望保存表單的子集。更多關於這裏https://docs.djangoproject.com/en/1。7/topics/forms/modelforms /#the-save-method – Anup

+0

我想我想在這裏添加幾行:'save:{ method:「ajax」, options:{ success:function(){ console .LOG( 「得救了!」); } } }'讓我所有的POST數據在後臺處理。但我只想創建一個新的測量集。 – broinjc

+0

那就是你想保存用戶輸入的所有數據?如果是這樣的話,那就是save comimit = False可以用來保存部分模型 – Anup

回答

1

Django提供其HttpRequest對象得心應手is_ajax方法,告訴您該HTTP_X_REQUESTED_WITH頭是否被設置。由於自動保存插件使用jQuery.ajax(),它會默認發送這個。

只要確保你可以:

或:

  • 使用csrf_exempt裝飾你的看法。 (這不是通常建議,應謹慎使用。)

你可以使用這個在視圖中創建它的一個組成部分,將妥善處理Ajax請求:

if request.is_ajax(): 
    # TODO: Handle autosave plugin save requests 
    pass 
else: 
    # this is where the normal stuff you already have happens 
    ... 

隨着自動保存插件,save callback採用與jQuery的AJAX方法相同的選項。一個典型的設置是這樣的:

{ url: "http://yourdomain.com/your-view", 
    data: {"key_for_server1": var1, "key_for_server2": var2}, 
    success: function() { 
      // pop up a nice green 'Saved!' message 
    }, 
    error: function() { 
      // alert "Oh, no! It didn't work!" 
    } 
} 

有一噸的選項,你可以設置我上面鏈接的文檔中詳細介紹,並自動保存插件直接通過他們通過這樣你就可以告訴它所有的同樣的事情。

主要的,上面是url將數據發送到(無論是在urls.py你的看法),data這是實際POST數據,你會送(後來在request.post字典中找到),以及successcompleteerror回調函數,它們是處理這些相應條件的函數。

請注意,它將基於服務器響應的HTTP狀態代碼來考慮成功或失敗。所以,例如,如果你raise Http404(不要 - 只是一個例子),它會調用error,但如果你返回一個正常的HttpResponse(通常是JSON),它會調用success

+0

非常感謝!這是非常重要的,我將在開始工作後將其標記爲正確。 – broinjc