在django模板中重定向用户
我有一个Django网站,根据用户类型的不同,网站的内容也会有所不同。我需要把那些没有权限查看某些内容的用户重定向到其他页面。
在我的模板中,我写了:
{% if user.get_profile.is_store %}
<!--DO SOME LOGIC-->
{%endif%}
我该怎么做才能把这些用户重定向回网站的首页呢?
====编辑====
def downloads(request):
"""
Downloads page, a user facing page for the trade members to downloads POS etc
"""
if not authenticated_user(request):
return HttpResponseRedirect("/professional/")
if request.user.get_profile().is_store():
return HttpResponseRedirect("/")
user = request.user
account = user.get_profile()
downloads_list = TradeDownloads.objects.filter(online=1)[:6]
downloads_list[0].get_thumbnail()
data = {}
data['download_list'] = downloads_list
return render_to_response('downloads.html', data, RequestContext(request))
我按照thornomad的回答去做了,但现在我遇到了他的错误。
Environment:
Request Method: GET
Request URL: http://localhost:8000/professional/downloads
Django Version: 1.1.1
Python Version: 2.6.2
Installed Applications:
['django.contrib.auth',
'django.contrib.admin',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'sico.news',
'sico.store_locator',
'sico.css_switch',
'sico.professional',
'sico.contact',
'sico.shop',
'tinymce',
'captcha']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware')
Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
92. response = callback(request, *callback_args, **callback_kwargs)
File "/var/www/sico/src/sico/../sico/professional/views.py" in downloads
78. if request.user.get_profile().is_store():
File "/var/www/sico/src/sico/../sico/shop/models.py" in is_store
988. return not self.account is None
File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/related.py" in __get__
191. rel_obj = self.related.model._base_manager.get(**params)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py" in get
120. return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py" in get
305. % self.model._meta.object_name)
Exception Type: DoesNotExist at /professional/downloads
Exception Value: Account matching query does not exist.
7 个回答
5
在模板中进行重定向其实是不太好的做法,很多回答都提到过这一点。
不过,如果在视图中重定向不太可行(不管是什么原因),你可以这样做:
{% if user.get_profile.is_store %}
{% include '/path/to/template' %}
{% else %}
{% include '/path/to/another_template' %}
{% endif %}
17
使用HTML的原始重定向。
{% if user.get_profile.is_store %}
<meta http-equiv="REFRESH" content="0;url=http://redirect-url">
{% endif %}
或者把重定向的链接作为一个上下文变量提供。
{% if user.get_profile.is_store %}
<meta http-equiv="REFRESH" content="0;url={{ user.get_profile.store_url }}">
{% endif %}
如果我没记错的话,这个应该放在“头部”标签里,但现代浏览器对这个要求宽松一些,像Firefox 4就允许放在“主体”标签里,也能正常工作。
26
我觉得你应该在一个叫做视图的地方做这个,而不是在模板里。所以,可以像这样做:
from django.http import HttpResponseRedirect
def myview(request):
if request.user.get_profile().is_store():
return HttpResponseRedirect("/path/")
# return regular view otherwise
如果你发现自己经常需要这样做,也可以使用一个叫@decorator
的东西来帮助视图。