2016-03-08 73 views
1

我有Bootstrap模式窗口更新數據每當我關閉它,我面臨所謂的雙重提交問題。也就是說,如果我按F5鍵,會彈出一條消息,告訴我我要第二次提交相同的數據,如果按OK鍵,它會將記錄插入到我的表中。此外,如果我嘗試第二次打開模式窗口,則渲染不正確!不知怎的,它與Django有什麼關係?瀏覽器雙重提交問題 - 引導+ 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; 
    }); 

但它沒有幫助。有任何想法嗎?

回答

1

那麼,這與Django沒有多大關係。瀏覽器緩存重新提交的發佈請求。最簡單的方法是在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黑客。

+0

「你可以通過查詢字符串來實現這一點」 - 你能否提供一些關於如何傳遞參數的示例代碼?我是Django的新手:)非常感謝你的回答。我花了整整一天的時間在這個 –

+0

如果你做'返回HttpResponseRedirect('your_url?foo = bar')',那麼在你的視圖裏可以通過'request.GET.get('foo')'訪問'foo'。這意味着它是作爲GET參數發送的,或換句話說作爲查詢字符串的一部分。 –