【问题标题】:Why doesn't Django allow redirect with context为什么 Django 不允许使用上下文重定向
【发布时间】:2015-06-11 12:53:23
【问题描述】:

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

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

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

我知道,一个可能的答案是使用自定义上下文而不是 redirect 调用 render,但是在发布请求后始终使用 redirect 不是一个好习惯吗?

谢谢。

【问题讨论】:

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

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 2015-06-22
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2013-07-10
    相关资源
    最近更新 更多