Django:登录后重定向到上一页


175

我正在尝试建立一个简单的网站,其登录功能与SO上的登录功能非常相似。该用户应该能够以匿名用户身份浏览该网站,并且每个页面上都会有一个登录链接。当单击登录链接时,用户将被带到登录表单。成功登录后,应将用户带回到他首先单击登录链接的页面。我猜想我必须以某种方式将当前页面的url传递给处理登录表单的视图,但是我真的无法使其正常工作。

编辑:我想通了。我通过将当前页面作为GET参数传递来链接到登录表单,然后使用“下一个”重定向到该页面。谢谢!

编辑2:我的解释似乎不清楚,所以这里要求的是我的代码:假设我们在页面foo.html上,并且尚未登录。现在,我们希望在foo.html上有一个链接,该链接登录。我们可以在那里登录,然后将其重定向回foo.html。foo.html上的链接如下所示:

      <a href='/login/?next={{ request.path }}'>Login</a> 

现在,我编写了一个自定义登录视图,看起来像这样:

def login_view(request):
   redirect_to = request.REQUEST.get('next', '')
   if request.method=='POST':
      #create login form...
      if valid login credentials have been entered:
         return HttpResponseRedirect(redirect_to)  
   #...
   return render_to_response('login.html', locals())

还有login.html中的重要一行:

<form method="post" action="./?next={{ redirect_to }}">

是的,就这样,希望可以弄清楚。


1
我认为Django登录信息可以为您解决这个问题,对您来说不起作用吗?
多米尼克·罗杰

Answers:


151

您无需为此额外查看,该功能已内置。

首先,每个具有登录链接的页面都需要知道当前路径,最简单的方法是将请求上下文前置变量添加到settings.py(默认为前四个),然后在每个请求中都可以使用请求对象:

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.request",
)

然后添加您想要“登录”链接的模板:

base.html:

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Login</a>

这会将GET参数添加到登录页面,该参数指向当前页面。

登录模板可以像下面这样简单:

registration / login.html:

{% block content %}
<form method="post" action="">
  {{form.as_p}}
<input type="submit" value="Login">
</form>
{% endblock %}

47
我个人使用了该解决方案,但是我要进行的一个修改是,如果request.path为null 则失败,因此我将其{% firstof request.path '/' %}设为,如果由于某种原因而导致用户无法将请求路径发送到主页,则使用该方法。
jorelli 2011年

1
我正在尝试实现您的解决方案,但是,当django.contrib.auth.views.login重定向(成功进行身份验证之后)时,User的实例不在请求中,因此user.is_authenticated()始终返回False。有什么帮助吗?
juankysmith,2012年

3
除了@jorelli之外,您可以使用命名URL <a href="{% url auth_login %}?next={% firstof request.path '/' %}">Login</a>来代替。
hobbes3 2012年

12
您还必须注意用户是否仅在注销后登录。换句话说,这next将是类似的情况,/accounts/logout/并且在用户登录后,他将立即被注销,大声笑,然后循环继续进行。
hobbes3 2012年

2
我发现只有在将以下内容添加到Django 1.5的登录表单上时,此方法才有效:<input type =“ hidden” name =“ next” value =“ {{next}}” />
Ellis Percival 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.