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

jör*_*örg 168 python django

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

编辑:我明白了.我通过将当前页面作为GET参数传递,然后使用"next"重定向到该页面来链接到登录表单.谢谢!

编辑2:我的解释似乎并不清楚所以这里要求的是我的代码:让我们说我们在页面foo.html上,我们没有登录.现在我们希望在foo.html上有链接链接到login.html.我们可以登录,然后重定向回foo.html.foo.html上的链接如下所示:

      <a href='/login/?next={{ request.path }}'>Login</a> 
Run Code Online (Sandbox Code Playgroud)

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

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())
Run Code Online (Sandbox Code Playgroud)

而login.html中的重要一行:

<form method="post" action="./?next={{ redirect_to }}">
Run Code Online (Sandbox Code Playgroud)

所以,这就是它,希望能说清楚.

sve*_*joh 145

您无需为此创建额外视图,该功能已内置.

首先,每个带有登录链接的页面都需要知道当前路径,最简单的方法是将请求上下文前处理器添加到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",
)
Run Code Online (Sandbox Code Playgroud)

然后在您想要登录链接的模板中添加:

base.html文件:

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Login</a>
Run Code Online (Sandbox Code Playgroud)

这将向登录页面添加一个GET参数,该参数指向当前页面.

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

登记/ login.html的:

{% block content %}
<form method="post" action="">
  {{form.as_p}}
<input type="submit" value="Login">
</form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

  • 我个人使用这个解决方案,但我要做的一个修改是,如果`request.path`为null,它会失败,所以我把它作为`{%firstof request.path'/'%}`,这样如果请求路径由于某种原因,用户无法被发送到主页. (46认同)
  • 您还必须注意用户是否在注销后登录.换句话说,`next`就像`/ accounts/logout /`,在用户登录之后,他会立即退出lol,循环继续. (12认同)
  • 添加@jorelli之后,您可以使用命名URL并执行"<a href="{% url auth_login%}?next = {%firstof request.path'/'%}">登录</a>. (3认同)
  • 我发现这仅在我将以下内容添加到 Django 1.5 的登录表单时才有效: &lt;input type="hidden" name="next" value="{{ next }}" /&gt; (2认同)

Gra*_*ant 27

这可能不是一个"最佳实践",但我之前成功地使用过这个:

return HttpResponseRedirect(request.META.get('HTTP_REFERER','/'))
Run Code Online (Sandbox Code Playgroud)

  • 这有一个弱点 - 一些用户/浏览器关闭了传递引用 (8认同)
  • 在用户到达表单,填写信息然后提交的情况下也存在问题.然后,HTTP_REFERER是表单页面的URL,而不是用户首先来自的页面的URL. (4认同)

arn*_*ntg 23

要支持具有param/values的完整URL,您需要:

?next={{ request.get_full_path|urlencode }}
Run Code Online (Sandbox Code Playgroud)

而不只是:

?next={{ request.path }}
Run Code Online (Sandbox Code Playgroud)


S.L*_*ott 14

Django的内置身份验证以您想要的方式工作.

他们的登录页面包含一个next查询字符串,该字符串是登录后返回的页面.

请查看http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required

  • 好吧,login_required装饰器可以正常工作,因为它设置了"我来自的任何页面的'下一步",但是当使用装饰器时,匿名用户无法查看该网站,因为他们将立即重定向到登录表单.我想我只需要弄清楚如何将'next'的值设置为用户来自的页面的url. (4认同)