繁体   English   中英

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

[英]Django: Redirect to previous page after login

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

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

编辑 2:我的解释似乎不清楚,所以这里要求的是我的代码:假设我们在一个页面 foo.html 上,但我们没有登录。现在我们希望在 foo.html 上有一个链接登录.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 }}">

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

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

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

设置.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",
)

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

基地.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 %}

要支持带有参数/值的完整网址,您需要:

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

而不仅仅是:

?next={{ request.path }}

这可能不是“最佳实践”,但我之前已经成功使用过:

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

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

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

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

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

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

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

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

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

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

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

你也可以这样做

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM