根据用户来自哪个页面来区分用户。 Django的

时间:2012-11-06 15:23:51

标签: python django django-templates

我想知道是否有办法区分用户,具体取决于他来自哪个页面。

在我的模板中,我只想在用户来自特定视图时显示内容(我不想显示我为其他用户显示的同一页面,但添加弹出窗口告诉他一些内容)。

有办法吗?

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

如果可能,请使用HTTP_REFERER request header。这适用于大多数情况。如果没有,那么你将不得不在会话中维护它。

要知道URL调用哪个视图函数,请使用django.core.urlresolvers.resolve。我认为这没有记录,但它非常直接,例如:

In [1]: from django.core import urlresolvers

In [2]: urlresolvers.resolve('/admin/')
Out[2]: ResolverMatch(func=<function index at 0xadb1924>, args=(), kwargs={}, url_name='index', app_name='admin', namespace='admin')

In [3]: urlresolvers.resolve('/admin/').func
Out[3]: <function django.contrib.admin.sites.index>

现在,对custom template filter中的HTTP_REFERER使用它可能如下所示:

from django import template
from django.core import urlresolvers

from yourapp.views import specific_view

register = template.Library()


@register.filter
def comes_from_specific_view(request):
    if not request.META.get('HTTP_REFERER', None):
        return False

    return urlresolvers.resolve(request.META['HTTP_REFERER']).func == specific_view

在模板中:

{% if request|comes_from_specific_view %}show popup{% endif %}

答案 1 :(得分:2)

有几种方法可以做到这一点:

  • 您可以在第一个视图中设置Cookie,并在目标视图中检查其值。如果用户经过其中的另一页,请不要忘记清理cookie。缺点是用户可以在浏览器中禁用cookie。
  • 根据用户进入目标视图的方式(链接或表单),您可以使用GET或POST参数。
  • 使用sessions

答案 2 :(得分:0)

我能想到的最简单的一般方法是创建一个中间件类,在用户会话中保存先前的请求路径,然后在模板中使用{{ user.session.previous_page }}。例如:

class ReferrerMiddleware(object):
    def process_request(self, request):
       if request.user.is_authenticated():
           request.user.session['previous_page'] = request.session['current_page']
           request.user.session['current_page'] = request.path