2015-04-07 59 views
1

this question和接受的答案可以清楚地看出,使用上下文重定向的唯一方法是将其保存在会话中。为什么Django没有一个简单的redirect方法需要像render这样的上下文对象呢?为什么Django不允许使用上下文重定向

例如,让我们说,我有一个登录视图,接受GETPOST请求。 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') 

请注意,在用户名/密码错误组合的进入,我想将用户重定向到同一个登录页面与上下文中的错误变量如此设置,模板可以绘制出一个警告。

我知道,一个可能的答案是调用renderredirect定义上下文,但那么是不是是一个很好的做法,始终使用redirect POST请求后?

谢谢。

+0

您可以使用GET变量的重定向,也可以使用消息框架 –

回答

2

这不是Django的限制,你似乎没有想过如何这将甚至工作。

重定向是一个简单的HTTP响应,它告诉浏览器去请求另一个页面。 Django或任何框架如何通过该重定向传递上下文?它会去哪里?接收URL将拥有自己的视图,它将生成自己的上下文 - 它将如何处理“重定向”上下文?它会如何知道?

但无论如何我不明白你为什么要将重定向回的错误。只需重新显示它。 POST后的重定向原则适用于成功的帖子,而不是不成功的帖子。

相关问题