为什么Django不允许重定向上下文

时间:2015-04-07 02:51:25

标签: python django django-forms django-templates django-views

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

例如,我们说,我有一个接受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')

请注意,输入错误的用户名/密码组合后,我想将用户重定向到同一个登录页面,并在上下文中设置错误变量,以便模板可以提示警告。

我知道,可能的答案是使用自定义上下文调用render而不是redirect,但是在帖子后总是使用redirect是一个好习惯。请求?

感谢。

1 个答案:

答案 0 :(得分:1)

这绝不是Django的限制,你似乎没有想过它会如何工作。

重定向是一种简单的HTTP响应,它会告诉您的浏览器去请求另一个页面。 Django或任何框架如何通过重定向传递上下文?它会去哪里?并且接收URL将具有其自己的视图,这将生成其自己的上下文 - 它将如何使用"重定向"背景?怎么会知道?

但无论如何,我不明白为什么你会想要在错误时将重定向回同一页面。只需重新显示它。 postirect-after-POST原则适用于成功的帖子,而不是不成功的帖子。