【问题标题】:double-submit issue in browsers - Bootstrap + Django浏览器中的双重提交问题 - Bootstrap + Django
【发布时间】:2016-03-08 19:31:18
【问题描述】:

我每次关闭时都有用于更新数据的 Bootstrap 模态窗口,我面临所谓的双重提交问题。也就是说,如果我按 F5,会弹出一条消息,告诉我我将第二次提交相同的数据,如果我按确定,它会在我的表中插入记录。此外,如果我第二次尝试打开模态窗口,它会呈现不正确!它与Django有什么关系吗?

模态窗口:

<form class="modal fade" id="openTaskWindow" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" method="post">{% csrf_token %}
  <div class="modal-dialog modal-lg form-horizontal" role="form">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="exampleModalLabel">Новая задача</h4>
      </div>
      <div class="modal-body" style="font-size: smaller">
        {{ createTask_form.as_p}}   
      </div>
      <div class="modal-footer">    
        <input class="btn btn-default btn-sm" type="submit" value="Сохранить"/>
      </div>
    </div>
  </div>
</form>

调用窗口的按钮:

<div><button type="button" data-toggle="modal" data-target="#openTaskWindow" data-backdrop="static" data-keyboard="false">Launch my modal</button></div>

视图(当模态窗口的提交按钮被按下时调用):

def createTask(request):
    taskTable = Tasks.objects.all()

    if request.method == 'POST':
        task_form = TaskForm(request.POST)

        if task_form.is_valid():
            temp_form = task_form.save(commit=False)
            temp_form.is_important = 0 
            temp_form.save()
            return render_to_response('task_management/task_list.html',{'createTask_form':temp_form, 'taskTable': taskTable},context_instance=RequestContext(request))
    else:
        task_form = TaskForm()
    return render_to_response('task_management/task_list.html',{'createTask_form':task_form, 'taskTable': taskTable, 'task_id':''},context_instance=RequestContext(request))

在阅读了社区的讨论后,我尝试这样做:

$('#openTaskWindow').submit(function() {
        location.href = location.href;
    });

但它没有帮助。有什么想法吗?

【问题讨论】:

    标签: django twitter-bootstrap double-submit-problem


    【解决方案1】:

    嗯,这与 Django 没有太大关系。浏览器缓存 post 请求以供重新提交。防止这种情况发生的最简单方法是在 for 有效时返回 HttpResponseRedirect

    所以改为

    if task_form.is_valid():
        temp_form = task_form.save(commit=False)
        temp_form.is_important = 0 
        temp_form.save()
        return render_to_response('task_management/task_list.html',{'createTask_form':temp_form, 'taskTable': taskTable},context_instance=RequestContext(request))
    

    试着去做

    if task_form.is_valid():
        temp_form = task_form.save(commit=False)
        temp_form.is_important = 0 
        temp_form.save()
        return HttpResponseRedirect('your_url')
    

    如果您需要向视图传递一些额外的参数,您可以通过查询字符串或基于会话的缓存来完成。而且你不需要你的 Javascript hack。

    【讨论】:

    • “你可以通过查询字符串来完成” - 你能提供给我关于如何传递参数的示例代码吗?我是 Django 的新手 :) 非常感谢您的回答。我花了一整天的时间
    • 如果您使用return HttpResponseRedirect('your_url?foo=bar'),那么在您的视图中foo 可以通过request.GET.get('foo') 访问。这意味着它是作为 GET 参数发送的,或者换句话说是作为查询字符串的一部分发送的。
    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 2016-09-24
    • 1970-01-01
    • 2011-06-09
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    相关资源
    最近更新 更多