我想知道是否有办法根据用户来自哪个页面来区分用户。
在我的模板中,我只想在用户来自特定视图时才显示某些内容(我不想显示我为其他用户显示的同一页面,而是添加一个弹出窗口告诉他一些事情)。
有没有办法做到这一点?
感谢您的帮助
我想知道是否有办法根据用户来自哪个页面来区分用户。
在我的模板中,我只想在用户来自特定视图时才显示某些内容(我不想显示我为其他用户显示的同一页面,而是添加一个弹出窗口告诉他一些事情)。
有没有办法做到这一点?
感谢您的帮助
如果可能,请使用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 %}
有几种方法可以做到这一点:
我能想到的最直接的通用方法是制作一个中间件类,将先前的请求路径保存在用户会话中,然后{{ 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