2009-11-30 69 views
4

我有洒取决于你是,我需要重定向无权查看该网站的某些方面的用户是什么用户类型Django的网站在我的模板用户,重定向在Django模板

,我有

{% if user.get_profile.is_store %} 
    <!--DO SOME LOGIC--> 
{%endif%} 

我该如何去重定向该商店回到该网站的索引?

==== ====编辑

ef 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. 

回答

16

你将要做到这一点,我认为,在视图不在模板。所以,像这样:

from django.http import HttpResponseRedirect 

def myview(request): 
    if request.user.get_profile().is_store(): 
     return HttpResponseRedirect("/path/") 

    # return regular view otherwise 

你也可以使用一个@decorator的观点,如果你发现自己需要这个做了很多。

+0

+1 - 击败我吧。绝对不想在模板中重定向。 – 2009-11-30 15:16:23

+2

我可以想到一些有效的情况,您希望模板确定是否重定向。大多数情况下发生在模板作者具有某些页面特定逻辑的情况下,这些逻辑确定您在查看此页面之前必须查看其他页面。 – 2012-04-20 18:41:04

+1

+1 @GregGlockner要添加另一个案例:从第三方库重写模板时。在某些情况下,重写模板比重写视图更容易,因为无论如何您都要自定义前者。 – Medorator 2014-06-12 03:40:03

1

你不会在模板中这样做,但在视图中。您可以拨打HttpResponseRedirect,而不是调用render_to_response(我认为您现在要这样做)。

2

我想你可能想在视图代码中做重定向。

例如,这可以在Django 1.1中使用。

from django.shortcuts import redirect 

def my_view(request): 
    if request.user.get_profile().is_store: 
     return redirect('index') 
    # normal view code here 
    return .... 

的文档重定向快捷方式是在这里:http://docs.djangoproject.com/en/dev/topics/http/shortcuts/的参数重定向()可以(引述文档):

  • 模型:模型的get_absolute_url()函数将被调用。
  • 视图名称,可能带有参数:urlresolvers.reverse()将用于反向解析名称。
  • 一个URL,它将用于重定向位置。
4

你真的不想在模板中重定向,就像在所有其他答案中所说的那样。

但是,如果在一个视图中重定向没有选项(为什么有的话),你可以这样做:

{% if user.get_profile.is_store %} 
    {% include '/path/to/template' %} 
{% else %} 
    {% include '/path/to/another_template' %} 
{% endif %} 
9

使用HTML的原始重定向。

{% if user.get_profile.is_store %} 
    <meta http-equiv="REFRESH" content="0;url=http://redirect-url"> 
{% endif %} 

或提供重定向URL作为变量上下文

{% if user.get_profile.is_store %} 
    <meta http-equiv="REFRESH" content="0;url={{ user.get_profile.store_url }}"> 
{% endif %} 

如果没有记错的权利,这已经是“头”标签内,但现代的浏览器更有宽容,火狐4使它在“身体”标签内,并且工作正常。

2

当然有时候我们有从django官方代码导入的视图,或者其他不依赖于我们的视图。我们不能在这些视图中放置重定向,所以唯一的方法是通过这些(不可触摸的)视图使用的模板。