在我第一次提交表单然后刷新表单后,它会重新提交,但我不希望这样。
这是我的模板表单:
<form action = "" method = "POST"> {% csrf_token %}
{{ form.as_p }}
<input type = "submit" value = "Shout!"/>
</form>
我该如何解决这个问题?
这是我的观点:
def index(request):
shouts = Shout.objects.all()
if request.method == "POST":
form = GuestBookForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
shout = Shout(author = cd['author'], message = cd['message'])
shout.save()
form = GuestBookForm()
else:
form = GuestBookForm()
return render_to_response('guestbook/index.html', {'shouts' : shouts,
'form' : form },
context_instance = RequestContext(request))
最佳答案
我的猜测是,这在您看来是一个问题。
成功提交并处理网络表单后,您需要使用返回 HttpResponseRedirect ,即使您只是重定向到同一 View 。否则,某些浏览器(我很确定 FireFox 会这样做)最终会提交表单两次。
以下是如何处理此问题的示例...
def some_view(request):
if request.method == "POST":
form = some_form(request.POST)
if form.is_valid():
# do processing
# save model, etc.
return HttpResponseRedirect("/some/url/")
return render_to_response("normal/template.html", {"form":form}, context_instance=RequestContext(request))
鉴于您最近在上面添加的 View ...
def index(request):
shouts = Shout.objects.all()
if request.method == "POST":
form = GuestBookForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
shout = Shout(author = cd['author'], message = cd['message'])
shout.save()
# Redirect to THIS view, assuming it lives in 'some app'
return HttpResponseRedirect(reverse("some_app.views.index"))
else:
form = GuestBookForm()
return render_to_response('guestbook/index.html', {'shouts' : shouts,
'form' : form },
context_instance = RequestContext(request))
这将使用 reverse重定向到同一 View (如果这就是您想要做的)
关于刷新后重新提交 django 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5823580/