从this question可以清楚地看出和接受的答案,使用上下文重定向的唯一方法是将其保存在 session 中。为什么 Django 没有像 render
那样采用一个简单的 redirect
方法来获取上下文对象?
例如,假设我有一个接受 GET
和 POST
请求的登录 View 。 GET
请求只是呈现用户可以输入凭据的表单,这将触发对同一 View 的 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 并不是一个好的做法
在发布请求之后?
谢谢。
最佳答案
这绝不是 Django 的限制,而且您似乎没有考虑过它是如何工作的。
重定向是一个简单的 HTTP 响应,它告诉您的浏览器去请求另一个页面。 Django 或任何框架如何通过该重定向传递上下文?它会去哪里?接收 URL 将有自己的 View ,这将生成自己的上下文 - 它会如何处理“重定向”上下文?它怎么知道?
但无论如何,我不明白为什么您会在出现错误时重定向回同一页面。只需重新显示它即可。 Redirect-after-POST 原则适用于成功的帖子,而不是不成功的帖子。
关于python - 为什么 Django 不允许使用上下文重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29482901/