从this question和接受的答案可以清楚地看出,重定向上下文的唯一方法是将其保存在会话中。为什么Django没有一个简单的redirect
方法来获取像render
这样的上下文对象呢?
例如,我们说,我有一个接受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
是一个好习惯。请求?
感谢。
答案 0 :(得分:1)
这绝不是Django的限制,你似乎没有想过它会如何工作。
重定向是一种简单的HTTP响应,它会告诉您的浏览器去请求另一个页面。 Django或任何框架如何通过重定向传递上下文?它会去哪里?并且接收URL将具有其自己的视图,这将生成其自己的上下文 - 它将如何使用"重定向"背景?怎么会知道?
但无论如何,我不明白为什么你会想要在错误时将重定向回同一页面。只需重新显示它。 postirect-after-POST原则适用于成功的帖子,而不是不成功的帖子。