2011-04-28 124 views
15

在我第一次提交表单并刷新表单后,它会重新提交并且我不希望这样。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)) 
+0

解释你的看法 – vad 2011-04-28 18:58:14

回答

32

我的猜测是这是您视图中的问题。

成功提交并处理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重定向到这个同样的观点(如果那就是你要做的)

+1

现货,我想。我有一个预感,并在OP提出意见之前回答了这个问题。 – 2011-04-28 19:05:26

+0

啊,我看到他在发布时增加了观点。我可以改变它来匹配。 – Brant 2011-04-28 19:09:07

+0

无需更改,我已经准备好了,谢谢! – Marijus 2011-04-28 19:10:46

1

最有可能的:当您刷新提交表单后,你再次显示(没有做任何事情)相同的形式页面。表单提交后,您需要重定向到记录页面或新页面。

这样,表单将变为空数据,刷新时不会重新提交。

0

使用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。