如何使用jquery自动保存django视图?

时间:2014-03-26 23:53:51

标签: jquery django

我有一个很长的formset显示在页面上。它目前保存如下:

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('/')

如何在每次用户填写其他输入时将整个测量集保存在后台?

到目前为止,这是我迄今为止所做的。如何使用回调通过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

1 个答案:

答案 0 :(得分: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