我正在尝试构建一个简单的网站,其登录功能与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 }}">
所以,这就是它,希望能说清楚。
答案 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' %}" />