【发布时间】:2015-06-11 12:53:23
【问题描述】:
从this question 和接受的答案中可以清楚地看出,使用上下文重定向的唯一方法是将其保存在会话中。为什么 Django 没有像 render 那样接受上下文对象的简单 redirect 方法?
例如,假设我有一个接受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')
请注意,在输入错误的用户名/密码组合时,我想将用户重定向到在上下文中设置错误变量的同一登录页面,以便模板可以发出警告。
我知道,一个可能的答案是使用自定义上下文而不是 redirect 调用 render,但是在发布请求后始终使用 redirect 不是一个好习惯吗?
谢谢。
【问题讨论】:
-
您可以使用带有 GET 变量的重定向,也可以使用消息框架
标签: python django django-forms django-templates django-views