Python 为什么';t Django允许使用上下文重定向
从中可以清楚地看出,使用上下文重定向的唯一方法是将其保存在会话中。为什么Django没有一个简单的Python 为什么';t Django允许使用上下文重定向,python,django,django-forms,django-templates,django-views,Python,Django,Django Forms,Django Templates,Django Views,从中可以清楚地看出,使用上下文重定向的唯一方法是将其保存在会话中。为什么Django没有一个简单的重定向方法,它接受一个像render这样的上下文对象 例如,假设我有一个登录视图,它同时接受GET和POST请求GETrequest只是呈现用户可以输入凭证的表单,这将触发对同一视图的POST调用。 请注意,在输入错误的用户名/密码组合时,我希望将用户重定向到相同的登录页面,并在上下文中设置错误变量,以便模板可以显示警告 我知道,一个可能的答案是使用自定义上下文调用render,而不是redire
重定向
方法,它接受一个像render
这样的上下文对象
例如,假设我有一个登录视图,它同时接受GET
和POST
请求GET
request只是呈现用户可以输入凭证的表单,这将触发对同一视图的POST
调用。
请注意,在输入错误的用户名/密码组合时,我希望将用户重定向到相同的登录页面,并在上下文中设置错误变量,以便模板可以显示警告
我知道,一个可能的答案是使用自定义上下文调用render
,而不是redirect
,但是在post请求后始终使用redirect
不是一个好做法吗
谢谢。这绝对不是Django的限制,而且您似乎还没有考虑到这是如何工作的 重定向是一个简单的HTTP响应,它告诉浏览器去请求另一个页面。Django或任何框架如何通过重定向传递上下文?它会去哪里?接收URL将有自己的视图,该视图将生成自己的上下文-它将如何处理“重定向”上下文?它怎么知道
但是在任何情况下,我都不明白为什么你会希望在出现错误时重定向回同一页。只需重新显示它。发布后重定向原则适用于成功的发布,而不是不成功的发布。您可以使用带有GET变量的重定向,也可以使用messages框架
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')