2014-03-26 2 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/ko/1에서 확인하십시오. – Anup

+0

여기에 몇 줄을 추가하고 싶습니다 :'save : { method : "ajax", 옵션 : { success : function() { console .log ("저장되었습니다!"); } } }'내 모든 POST 데이터를 백그라운드에서 볼 수 있도록 처리합니다. 그러나 나는 단지 하나의 새로운 서베이 세트 만 만들어지기를 원합니다. – broinjc

+0

사용자가 입력 한 모든 데이터를 저장 하시겠습니까? 그렇다면 저장합니다. comimit = False를 사용하여 부분 모델을 저장합니다. – Anup

답변

1

장고는 HTTP_X_REQUESTED_WITH 헤더가 설정되었는지 여부를 알 수는 HttpRequest 객체에 편리한 is_ajax 방법을 제공한다. 자동 저장 플러그인은 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!" 
    } 
} 

그래서 당신은 그것을 모두 같은 것을 알 수 있습니다.

주요 것들, 위의 success (나중에 request.post DICT에서 발견) 당신이 보내드립니다 실제 POST 데이터가 (보기 위해 urls.py에 무엇이든)에 데이터를 전송하는 url, data이며, completeerror 콜백 (callbacks)은 해당 조건을 처리하는 함수입니다.

서버 응답의 HTTP 상태 코드에 따라 성공 또는 실패한 것으로 간주됩니다. 예를 들어 raise Http404 인 경우 error을 호출하지만 보통 HttpResponse (일반적으로 JSON)을 반환하면 success이 호출됩니다.

+0

정말 고마워요! 이것은 많은 것을 받아들입니다, 나는 이것을 올바르게 작동시킨 후에 이것을 정확하게 표시 할 것입니다. – broinjc

관련 문제