2013-12-11 22 views
2

我在我處理的形式和重定向成功提交的用戶,像這樣一類基於視圖:Django的 - 能夠後才HttpResponseRedirect訪問頁

views.py

def get(self,request): 
    form = self.form_class() 
    return render(request, template_name, { 'form' : form }) 
def post(self, request, *args, **kwargs): 
    form = self.form_class(request.POST) 
    if form.is_valid(): 
      ... 
     return HttpResponseRedirect(reverse('success')) 

return render(request, template_name, { 'form' : form }) 

urls.py

... 
url(r'^submit/success', SubmitView.as_view(), name='success'), 
... 

它可以直接通過輸入更迭訪問URL S /提交。我沒有在網站上使用任何身份驗證,並希望用戶只能在重定向後訪問提交/成功頁面,以便他們無法直接訪問它。我該怎麼做?

回答

2

如果您正在使用sessions,可以完成像這樣:

# in the view where form is submitted 
if form.is_valid(): 
    request.session['form-submitted'] = True 
    return HttpResponseRedirect(reverse('success')) 

# in the success view 
def get(self, request): 
    if not request.session.get('form-submitted', False): 
     # handle case where form was not submitted 
    else: 
     # render the template 
+0

這是否也適用於多標籤/窗口查看? – Private

+0

取決於瀏覽器。如果瀏覽器爲所有打開的窗口/選項卡維護相同的會話,則此方法應起作用。 – miki725

+0

這看起來像一個可行的解決方案。我會嘗試使用會話。謝謝! – dev4Fun

1

而不是重定向,你可以POST到'成功'頁面。 然後使用if request.method == 'POST': 但要小心,這是不是安全,因爲頭可以被欺騙。

更好的方法是調用POST方法中的成功視圖,我想。

+0

不是一個好主意,可以從'POST'內調用成功視圖,因爲用戶然後可以刷新頁面,因此重新提交表單,再次,再次等等...... – miki725

+0

及其官方建議的Django練習返回對錶格成功的重定向 – miki725

+0

想到了這一點,但總的來說,這看起來像個壞主意。感謝您的建議 – dev4Fun

0

你有沒有嘗試過這樣的事情:

if form.is_valid(): 
     ... 
    return HttpResponseRedirect(SubmitView.as_view()) 

不知道這是否開箱的,但更多的技巧你可能會得到你想要的。

0

要添加到答案@ miki725貼我也將確保你改變

request.session['form-submitted'] = False

你已經進入了

if not request.session.get('form-submitted', False):

後,爲了防止直接訪問頁面或在瀏覽器上使用後退和前進。