2014-04-27 160 views
0

我正在提交表單。之後,我正在做HttpResponseRedirect,以便表單不會被提交,如果我刷新頁面。但是,如果我在瀏覽器中再次提交表單,該表單將被保存多次。我怎樣才能防止這個?阻止表單被多次提交 - django

我想會的,這意味着我設置這樣的會議名稱:

if request.session.get('saved', False): 
    return HttpResponseRedirect('/already_saved/')  
entry.save() # <-- pseudo save 
request.session['saved'] = True 

但這會導致用戶不能發送另一種形式在我的網頁在他的實際會話。

如何爲每個表單創建唯一的會話,以便一個表單不會多次提交,但仍可以提交其他表單?

+0

您可以添加一個Expires頭頁面過去一段時間(-1),使用後退按鈕時頁面無效。 使用會話cookie來存儲它也會起作用。 – shaunl

+0

看看這裏:http://stackoverflow.com/questions/5823580/django-form-resubmitted-upon-refresh –

+0

@PatrickBassut我沒有刷新問題,我有問題,回去按鈕。但是,無論如何謝謝 – doniyor

回答

2

一種方法是對錶單的字段進行哈希,當服務器收到請求時,檢查表單的哈希是否已經存在(例如表單已經提交)。事情是這樣的:

import hashlib 
from django.shortcuts import Http404 
sha512 = hashlib.sha512() 
sha512.update(form_fields_stringfied) 

if not request.session['forbidden_data']: 
    request.session['forbidden_data'] = [] 

hashed_form = sha512.hexdigest() 
if hashed_form not in request.session['forbidden_data']: 
    request.session['forbidden_data'].append(hashed_form) 
else: 
    raise Http404 

其中hashed_form的表單數據級聯或以任何你喜歡

因此,若等於沒有兩種形式都不會被提交

+0

@ doniyor呢? –

+0

如果表單來自客戶端,我該如何哈希值並設置爲某個字段? – doniyor

+0

我不明白。只要用戶完成會話,會話變量就會保持不變。並且表單不應該直接與哈希有任何關係。散列是服務器端的事情,我們做了檢查表單是否重複。就這樣。 –