Перенаправление пользователя в шаблоне Django - PullRequest
5 голосов
/ 30 ноября 2009

У меня есть сайт django, который распространяется в зависимости от того, какой у вас тип пользователя, мне нужно перенаправить пользователей, которые не имеют права видеть определенные аспекты сайта,

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

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

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

==== EDIT ====

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))

Я реализую ответ от Торномада, и теперь я получаю его ошибку

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.

Ответы [ 6 ]

19 голосов
/ 30 ноября 2009

Вы, вероятно, захотите сделать это в представлении , а не в шаблоне . Итак, что-то вроде:

from django.http import HttpResponseRedirect

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

    # return regular view otherwise

Вы также можете использовать @decorator для представления, если вам понадобится сделать это много.

14 голосов
/ 07 апреля 2011

Использовать необработанное перенаправление 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 %}

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

5 голосов
/ 30 ноября 2009

Вы действительно не хотите перенаправлять в шаблоне, как сказано во всех других ответах.

Но если перенаправление в представлении не вариант (почему вообще), вы можете сделать это:

{% if user.get_profile.is_store %}
    {% include '/path/to/template' %}
{% else %}
    {% include '/path/to/another_template' %}
{% endif %}
2 голосов
/ 09 мая 2012

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

2 голосов
/ 30 ноября 2009

Я думаю, что вы, возможно, захотите сделать перенаправление в коде представления.

Например, это будет работать в 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/ Аргументы для redirect () могут быть (цитируя документы):

  • Модель: будет вызвана функция get_absolute_url () модели.
  • Имя представления, возможно, с аргументами: urlresolvers.reverse () будет использоваться для обратного разрешения имени.
  • URL-адрес, который будет использоваться как есть для местоположения перенаправления.
1 голос
/ 30 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...