【问题标题】:How to handle duplicate form submission with Django?如何使用 Django 处理重复的表单提交?
【发布时间】:2017-10-27 15:13:52
【问题描述】:

如何处理第二次提交重复请求如果由于服务器延迟而导致第一次提交尚未完成时用户试图刷新页面。

  • 客户端禁用提交按钮以避免多次提交。
  • 并在表单提交重定向到成功视图后处理发布/重定向/获取模式

我相信两者都处理得很好。

class SomeView(View):
  def post(self, request, *args, **kwargs):
    if form.is_valid()
      if request_exists(request):
        # here I can raise the exception also 
        # But How I redirect the customer to sucess page 
        # If 1st submission got success response.
      else:
        # here I have called internal api to get/post some data.
        # user refreshes before this call has completed.
        ...
        # once getting respose its ALWAYS redirect to new page
        return HttpResponseRedirect('/thanks/') 

但是如果从 API 调用获得响应延迟,如何处理这种情况。我需要延迟到第一次提交完成。然后我必须将用户发送到感谢页面。

【问题讨论】:

  • 解决方案描述了here。如果我们在您的视图中有冗长的 API 调用或任何作业,只需在单独的离线任务中触发它,并尽快将用户重定向到新页面并显示一些等待消息。

标签: python django design-patterns


【解决方案1】:

可以通过 python 实现,但是会非常复杂。有一种更简单的方法可以实现您的目标。只需用户 JQuery 并禁用该按钮,一旦用户点击它。这样用户就不能点击两次。

在模板中,您有视图的表单,添加以下脚本(根据您的需要调整):

$(document).ready(function(){
    var myButton = $('#my_button_id');  // your button ID here
    myButton.on('click', function(){
        myButton.prop('disabled', true);
    });
};

使用 JQuery,您还可以将按钮名称更改为微调器,使其看起来像正在加载。我为此使用了 FontAwesome (http://fontawesome.io/icon/spinner/)。

【讨论】:

  • 是的,这会起作用但是这里的问题是如何防止重复提交来自浏览器刷新。 从 JS 中禁用提交按钮Post/Reedirect/Get 都在视图中处理
  • 关于 fontawesome 用法的说明:这是一个很重的文件,不要仅仅为了在网页上获得一个微调器而导入它。
猜你喜欢
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 2012-10-04
  • 2016-11-13
相关资源
最近更新 更多