django表单在刷新时重新提交
问题描述:
在我第一次提交表单并刷新表单后,它会重新提交并且我不希望这样。django表单在刷新时重新提交
这里是我的模板形式:
<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))
答
我的猜测是这是您视图中的问题。
成功提交并处理Web表单后,即使您只是重定向到相同视图,也需要使用返回HttpResponseRedirect。否则,某些浏览器(我很确定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))
鉴于你最近添加视图上方...
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重定向到这个同样的观点(如果那就是你要做的)
答
最有可能的:当您刷新提交表单后,你再次显示(没有做任何事情)相同的形式页面。表单提交后,您需要重定向到记录页面或新页面。
这样,表单将变为空数据,刷新时不会重新提交。
答
使用HttpResponseRedirect
创建一个新视图(可以说thank_you
),以便在提交表单并返回模板后显示成功的消息。
成功的表单提交后做返回HttpResponseRedirect( “/感谢你/”)新感谢您查看
from django.http import HttpResponseRedirect
def thank_you(request, template_name='thank-you.html'):
return render_to_response(template_name,locals(),context_instance=RequestContext(request))
和urls.py
url(r'^thank-you/$','thank_you', name="thank_you")
多形式提交发生的原因是,当页面刷新相同的url命中时,它会一次又一次地调用相同的视图,因此多个条目保存在数据库中。为了防止这种情况发生,我们需要将响应重定向到新的url/view,以便下一次页面刷新时会触发新的url/view。
解释你的看法 – vad 2011-04-28 18:58:14