首页 文章

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

提问于
浏览
157

我正在尝试构建一个简单的网站,其登录功能与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 回答

  • 134

    你也可以这样做

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

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

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

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

  • 21

    请参阅django docs for views.login(),在输入表单上提供'next'值(作为隐藏字段)以在成功登录后重定向到 .

  • 14

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

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

    而不只是:

    ?next={{ request.path }}
    
  • -2

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

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

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

  • 1

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

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

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

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

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

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

    Note: The file should contain above lines only.

相关问题