Django login_required装饰者没有通过" next"模板的价值

时间:2014-08-10 14:58:39

标签: python django

我想在我的网站上查看要求用户登录。

@login_required
def checkout(request, campaign_id, artist_id, default_amount):

这正确地将用户重定向到视图"登录"如果用户在尝试访问视图时未登录:

def login(request):
    if request.method == 'POST':
        username = request.POST['usermail']
        password = request.POST['password']
        redirect = request.POST['next']
        user = authenticate(username = username, password = password)
        if user is not None:
            if user.is_active:
                auth_login(request, user)
                return HttpResponseRedirect(redirect)
            else:
                return render(request, 'login.html')
        else:
            return render(request, 'login.html')
    return render(request, 'login.html')

我想要做的是将用户发送到登录后最初请求的页面...但是,我似乎无法访问模板中的{{next}}变量。

<input type="hidden" name="next" value="{{ next }}" />

当我查看呈现的页面源代码时,它没有获得&#34; next&#34;的值:

<input type="hidden" name="next" value=""/>

即使URL确实具有该值:

http://127.0.0.1:8080/login/?next=/campaign/the-slowdown/vote-for/cut-copy/25

2 个答案:

答案 0 :(得分:1)

要访问模板中的next变量,您必须通过render函数传递该变量。在您的视图中,添加以下内容:

context = {'next': request.GET['next'] if request.GET and 'next' in request.GET else ''}
return render(request, 'login.html', context)

然后,您{{ next }}将出现在您的模板中,就像在您的网址中一样。

此外,您可以删除else: return render(request, 'login.html'),因为它们已过时。

答案 1 :(得分:1)

要访问模板中的请求变量,您需要使用请求上下文处理器,因此:

在setttings.py中:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'django.core.context_processors.request',
    ...        
)

然后在您的模板中,您可以访问下一个var:

{{ request.GET.next }}

虽然我会在视图中实现这种逻辑,然后在上下文中分配,而不是像模板中那样访问它。