從this question和接受的答案可以清楚地看出,使用上下文重定向的唯一方法是將其保存在會話中。爲什麼Django沒有一個簡單的redirect
方法需要像render
這樣的上下文對象呢?爲什麼Django不允許使用上下文重定向
例如,讓我們說,我有一個登錄視圖,接受GET
和POST
請求。 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')
請注意,在用戶名/密碼錯誤組合的進入,我想將用戶重定向到同一個登錄頁面與上下文中的錯誤變量如此設置,模板可以繪製出一個警告。
我知道,一個可能的答案是調用render
比redirect
定義上下文,但那麼是不是是一個很好的做法,始終使用redirect
POST請求後?
謝謝。
您可以使用GET變量的重定向,也可以使用消息框架 –