2009-11-30 2 views
4

У меня есть веб-сайт Джанго, который пролито в зависимости от того, какой тип пользователя вы, мне нужно, чтобы перенаправить пользователей, которые не имеют права видеть некоторые аспекты сайта,Перенаправление пользователя в шаблоне Django

в моем шаблоне , У меня есть

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

Как я могу перенаправить указанный магазин обратно в индекс сайта?

==== ==== EDIT

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 - Ударьте меня. Определенно не хотят перенаправляться в шаблон. –

+2

Я могу думать о некоторых действительных случаях, когда вы хотите, чтобы шаблон определял, нужно ли перенаправлять. Большинство случаев возникают, когда автор шаблона имеет определенную специфику для конкретной страницы, которая определяет, что вам нужно просмотреть другую страницу перед просмотром этой страницы. –

+1

+1 @GregGlockner Чтобы добавить другой случай: когда вы переопределяете шаблон из сторонней библиотеки. В некоторых случаях проще перенаправить шаблон, чем переопределить представление, потому что вы все равно настраиваете его. – Medorator

1

Вы бы этого не сделали в шаблоне, но в представлении. Вместо вызова render_to_response (который, как я полагаю, вы делаете сейчас) вы вызываете HttpResponseRedirect.

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 %} 

, если не изменяет память, это должно быть внутри тега «головы», но современный браузер более терпимы, Firefox 4 позволило ему внутри тега body и работает нормально.

2

Конечно, иногда у нас есть виды, импортированные из официального кода django или другие, что не зависит от нас.Мы не можем размещать переадресацию в этих представлениях, поэтому единственный способ - использовать шаблон, который использует эти (неприкасаемые) представления.

Смежные вопросы