Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么';t Django允许使用上下文重定向_Python_Django_Django Forms_Django Templates_Django Views - Fatal编程技术网

Python 为什么';t 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

从中可以清楚地看出,使用上下文重定向的唯一方法是将其保存在会话中。为什么Django没有一个简单的
重定向
方法,它接受一个像
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')