2013-03-08 101 views
10

我很困惑我有這個問題,我希望有人能指出我的錯誤。Django:POST方法後重定向到當前頁面顯示重新發布警告

我在views.py中有一個方法,它綁定到一個具有表單的模板。代碼如下所示:

def template_conf(request, temp_id): 
    template = ScanTemplate.objects.get(id=int(temp_id)) 
    if request.method == 'GET': 
     logging.debug('in get method of arachni.template_conf')  
     temp_form = ScanTemplateForm(instance=template)) 
     return render_response(request, 'arachni/web_scan_template_config.html', 
           { 
           'template': template, 
           'form': temp_form, 
           }) 
    elif request.method == 'POST': 
     logging.debug('In post method') 
     form = ScanTemplateForm(request.POST or None, instance=template) 
     if form.is_valid(): 
      logging.debug('form is valid') 
      form.save() 
      return HttpResponseRedirect('/web_template_conf/%s/' %temp_id) 

此頁面的行爲是這樣的:當我按下「提交」按鈕,程序進入POST分公司,併成功地執行在分支機構的一切。然後HttpResponseRedirect只重定向到當前頁面(該url是當前網址,我認爲應該等於.)。之後,GET分支自我重定向到當前頁面後被執行,並且頁面成功返回。但是,如果我刷新頁面,此時,瀏覽器返回一個確認警告:

The page that you're looking for used information that you entered. 
Returning to that page might cause any action you took to be repeated. 
Do you want to continue? 

如果我確認,POST數據將被張貼到後端一次。看起來像瀏覽器仍然保存着以前的POST數據。我不知道爲什麼會發生這種情況,請幫助。謝謝。

+0

+1我有完全相同的問題。我有類似的代碼,但它似乎只能在Firefox中正常工作。 – 2013-03-08 16:21:45

+0

@KevinDiTraglia:哦,我以前沒有嘗試過Firefox,但看起來像firefox做的工作。很奇怪...... – 2013-03-08 16:26:36

+0

@KevinDiTraglia這是Chrome 25中的一個錯誤,請參閱下面的答案。 – Alasdair 2013-03-10 15:33:48

回答

2

如果您的表單操作設置爲「。」,則不需要執行重定向。瀏覽器警告不在您控制範圍內以覆蓋。您的代碼可以大大簡化:

# Assuming Django 1.3+ 
from django.shortcuts import get_object_or_404, render_to_response 

def template_conf(request, temp_id): 
    template = get_object_or_404(ScanTemplate, pk=temp_id) 
    temp_form = ScanTemplateForm(request.POST or None, instance=template) 

    if request.method == 'POST': 
     if form.is_valid(): 
      form.save() 
      # optional HttpResponseRedirect here 
    return render_to_response('arachni/web_scan_template_config.html', 
      {'template': template, 'form': temp_form}) 

這將簡單地堅持您的模型並重新呈現視圖。如果您想在撥打.save()後做一個HttpResponse重定向到不同的視圖,那麼這不會導致瀏覽器警告您必須重新提交POST數據。

此外,對於您將重定向到的URL模式進行硬編碼並不需要,也不是好習慣。使用django.core.urlresolvers中的reverse方法。如果你的URL需要改變,它會讓你的代碼更容易重構。

+0

非常感謝您的建議。學到了很多。一個問題:在Django 1.4中是「渲染」方法嗎?我目前正在安裝1.3。 – 2013-03-08 18:37:09

+0

是的,render僅在1.4.x +中可用。如果您使用1.3,則需要使用render_to_response。 – Brandon 2013-03-08 18:40:44

+0

我已經更新了Django 1.3.x兼容代碼示例 – Brandon 2013-03-08 18:43:04

7

看起來您正遇到Chrome 25中的錯誤(請參閱Chromium issue 177855),該錯誤正在處理錯誤地重定向。它已在Chrome 26中修復。

您的原始代碼是正確的,但可以按照Brandon的建議稍微簡化。我建議你redirect after a successful post request,因爲它可以防止用戶意外地重新提交數據(除非他們的瀏覽器有錯誤!)。

+0

回答這個問題永遠不會太晚!感謝您的信息和我的代碼確認。 +1 – 2013-03-11 03:03:30

相關問題