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

时间:2009-04-30 13:14:15

标签: 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> 

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

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 }}">

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

9 个答案:

答案 0 :(得分:139)

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

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

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

<强>登记/ login.html的:

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

答案 1 :(得分:26)

这可能不是“最佳做法”,但我之前已成功使用过这个:

return HttpResponseRedirect(request.META.get('HTTP_REFERER','/'))

答案 2 :(得分:22)

要支持包含您需要的param /值的完整网址:

?next={{ request.get_full_path|urlencode }}

而不只是:

?next={{ request.path }}

答案 3 :(得分:14)

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我遇到了同样的问题。此解决方案允许我继续使用通用登录视图:

urlpatterns += patterns('django.views.generic.simple',
    (r'^accounts/profile/$', 'redirect_to', {'url': 'generic_account_url'}),
)

答案 6 :(得分:1)

registration/login.html(嵌套在templates文件夹中)如果插入以下行,页面将呈现为Django的原始管理员登录页面:

{% include "admin/login.html" %}

注意:文件只应包含以上行。

答案 7 :(得分:-1)

请参阅views.login()的django文档,在输入表单上提供“下一个”值(作为隐藏字段),以便在成功登录后重定向到。

答案 8 :(得分:-2)

你也可以这样做

<input type="hidden" name="text" value="{% url 'dashboard' %}" />