我想知道是否有办法区分用户,具体取决于他来自哪个页面。
在我的模板中,我只想在用户来自特定视图时显示内容(我不想显示我为其他用户显示的同一页面,但添加弹出窗口告诉他一些内容)。
有办法吗?
感谢您的帮助
答案 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)
有几种方法可以做到这一点:
答案 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