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

所以,是的,差不多就是这样,希望这能说清楚。

117139 次浏览

Django 的内置身份验证可以按照你想要的方式工作。

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

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

有关 Login (),请参阅 django docs,在输入表单上提供一个“ next”值(作为隐藏字段) ,以便在成功登录后重定向到该值。

我将当前页面作为 GET 参数传递,然后使用‘ next’重定向到该页面,从而链接到登录表单。谢谢!

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

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

您不需要为此创建额外的视图,该功能已经内置。

首先,带有登录链接的每个页面都需要知道当前路径,最简单的方法是将请求上下文预处理器添加到 setings.py (默认值为4) ,然后请求对象将在每个请求中可用:

设置:

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",
)

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

Html:

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

这将向指向当前页面的登录页面添加一个 GET 参数。

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

登记/登入.html:

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

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

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

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

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

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

要使用 param/值支持完整的 url,您需要:

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

而不仅仅是:

?next=\{\{ request.path }}

你也可以这么做

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