在登录页面上显示“取消”以将用户返回到他们所在的位置(使用django.contrib.auth)

时间:2012-02-20 12:44:48

标签: django django-authentication

我们正在使用@login_required装饰器,以便用户在尝试访问需要进行身份验证的URL时看到登录页面。 我们希望在登录页面上显示“取消”按钮,该按钮应该将用户返回到他们尝试访问网址时所处的页面(通过单击链接等 - 我们无需手动输入它们网址。

目前我们的login.html正在查找请求参数'login_cancel_url',如果存在则使用该参数(否则使用主页)。

但是,这意味着每当我们显示导致“需要身份验证”网址的链接或按钮时,我们必须手动传递此参数(设置为当前页面的网址)。

有更优雅的方法吗?

谢谢,马丁

1 个答案:

答案 0 :(得分:1)

您可以尝试从请求中获取referrer header,但据我所知,它取决于浏览器和is not very reliable,因此您的方式可能是最好的。您可以尝试通过创建模板标记来简化生活,以避免手动重写返回URL。

您可以轻松地在任何页面上从django的request对象获取当前网址,因此您可以编写一段html代码,而不是在链接上手动设置它:

<强> link_to_login.html

<!-- You should probably get /login/ using the {% url ... %} template tag -->
<a href="/login/?login_cancel_url={{ request.path|urlencode }}">
Login Page</a>

并使用{% include "link_to_login.html"%}模板标记。

或者,如果根据链接需要改变文字,您可以创建inclusion template tag

<强> templatetags / extra_auth_tags.py

@register.inclusion_tag('templates/extra_auth_tags/login_link.html')
def login_link(context, text=None):
return {
    'text':text
}

<强>模板/ extra_auth_tags / login_link.html

<!-- You should probably get /login/ using the {% url ... %} template tag -->
<a href="/login/?login_cancel_url={{ request.path|urlencode }}">
{% if text %}
    {{ text }}
{% else %}
    Some Default Text
{% endif %}
</a>

然后在模板中将其称为{% login_link text="Check you messages" %}。请注意,包含标记的关键字参数仅在django dev版本中受支持,因此您可能需要手动编写模板标记。