浏览器中的双重提交问题 - Bootstrap + Django
double-submit issue in browsers - Bootstrap + Django
我有Bootstrap模态window每次关闭它都会更新数据,我面临所谓的双重提交问题。也就是说,如果我按 F5,会弹出一条消息,告诉我我要第二次提交相同的数据,如果我按确定,它会将记录插入到我的 table 中。此外,如果我第二次尝试打开模态window,它会被错误地渲染!它与 Django 有什么关系吗?
模态window:
<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">×</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>
调用 window 的按钮:
<div><button type="button" data-toggle="modal" data-target="#openTaskWindow" data-backdrop="static" data-keyboard="false">Launch my modal</button></div>
视图(按下模式 window 的提交按钮时调用):
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没有太大关系。浏览器缓存 post 请求重新提交。防止这种情况的最简单方法是 return HttpResponseRedirect
当 for 有效时。
所以
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。
我有Bootstrap模态window每次关闭它都会更新数据,我面临所谓的双重提交问题。也就是说,如果我按 F5,会弹出一条消息,告诉我我要第二次提交相同的数据,如果我按确定,它会将记录插入到我的 table 中。此外,如果我第二次尝试打开模态window,它会被错误地渲染!它与 Django 有什么关系吗?
模态window:
<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">×</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>
调用 window 的按钮:
<div><button type="button" data-toggle="modal" data-target="#openTaskWindow" data-backdrop="static" data-keyboard="false">Launch my modal</button></div>
视图(按下模式 window 的提交按钮时调用):
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没有太大关系。浏览器缓存 post 请求重新提交。防止这种情况的最简单方法是 return HttpResponseRedirect
当 for 有效时。
所以
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。