如何使用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将内容发送到服务器?

  
{% csrf_token %} {{ survey_formset.management_form|crispy }} {% for form in survey_formset.forms %}
{% crispy form %}
{% endfor %}
$(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!"); } } } } }); });

我正在使用这个人代码:

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

Django在其HttpRequest对象上提供了一个方便的is_ajax方法,告诉您是否设置了HTTP_X_REQUESTED_WITH标头。 由于autosave插件使用jQuery.ajax() ,它默认会发送它。

请确保您:

  • 在JavaScript中设置正确的CSRF令牌

要么:

  • 在视图上使用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 ... 

使用自动保存插件, 保存回调采用与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 dict中找到),以及successcompleteerror回调,它们是处理这些相应条件的函数。

请注意,它将根据服务器响应的HTTP状态代码考虑成功或失败。 所以,例如,如果你raise Http404 (不要 – 只是一个例子)它会调用error ,但如果你返回一个正常的HttpResponse (通常是JSON),它将调用success