2015-04-07 62 views
1

this question和接受的答案可以清楚地看出,使用上下文重定向的唯一方法是將其保存在會話中。爲什麼Django沒有一個簡單的redirect方法需要像render這樣的上下文對象呢?爲什麼Django不允許使用上下文重定向

例如,讓我們說,我有一個登錄視圖,接受GETPOST請求。 GET請求只是呈現用戶可以輸入憑據的表單,這將觸發對相同視圖的POST調用。

def login(request, *args, **kwargs): 
    if request.method == 'GET': 
     context = {} 
     context.update(csrf(request)) 
     return render(request, 'login.html', context=context) 
    elif request.method == 'POST': 
     username = request.POST.get('username', '') 
     password = request.POST.get('password', '') 
     user = auth.authenticate(username=username, password=password) 
     if user is not None: 
      auth.login(request, user) 
      return redirect('loggedin') 
     else: 
      # Redirect with a context object that has 'error':True, 
      # so that the login template can display error message: 
      # 'Username/password is incorrect' 
      redirect('login') 

    return redirect('invalid') 

請注意,在用戶名/密碼錯誤組合的進入,我想將用戶重定向到同一個登錄頁面與上下文中的錯誤變量如此設置,模板可以繪製出一個警告。

我知道,一個可能的答案是調用renderredirect定義上下文,但那麼是不是是一個很好的做法,始終使用redirect POST請求後?

謝謝。

+0

您可以使用GET變量的重定向,也可以使用消息框架 –

回答

2

這不是Django的限制,你似乎沒有想過如何這將甚至工作。

重定向是一個簡單的HTTP響應,它告訴瀏覽器去請求另一個頁面。 Django或任何框架如何通過該重定向傳遞上下文?它會去哪裏?接收URL將擁有自己的視圖,它將生成自己的上下文 - 它將如何處理「重定向」上下文?它會如何知道?

但無論如何我不明白你爲什麼要將重定向回的錯誤。只需重新顯示它。 POST後的重定向原則適用於成功的帖子,而不是不成功的帖子。

相關問題