2011-04-28 104 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。