2

我想知道是否有办法根据用户来自哪个页面来区分用户。

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

有没有办法做到这一点?

感谢您的帮助

4

3 回答 3

3

如果可能,请使用HTTP_REFERER 请求标头。这在大多数情况下都有效。如果没有,那么您必须在会话中维护它。

要了解 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>

现在,在自定义模板过滤器中对 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 %}
于 2012-11-06T15:36:20.670 回答
2

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

  • 您可以在第一个视图中设置 cookie,并在目标视图中检查其值。如果用户在两者之间浏览另一个页面,请不要忘记清理 cookie。缺点是用户可以在其浏览器中禁用 cookie。
  • 根据用户转到目标视图(链接或表单)的方式,您可以使用 GET 或 POST 参数。
  • 使用会话
于 2012-11-06T15:33:53.010 回答
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
于 2012-11-06T15:37:26.490 回答