在Django模板中重定向用户

2skhul33  于 2023-08-08  发布在  Go
关注(0)|答案(7)|浏览(111)

我有一个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.

p1iqtdky

p1iqtdky1#

你会想这样做,我想,在一个 * 视图 * 而不是在 * 模板 *。比如说:

from django.http import HttpResponseRedirect

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

    # return regular view otherwise

字符串
如果您发现自己经常需要这样做,也可以使用@decorator作为视图。

dfddblmv

dfddblmv2#

使用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允许它在“身体”标签内,工作正常。

dtcbnfnu

dtcbnfnu3#

你真的不想在模板中重定向,就像所有其他答案中所说的那样。
但是如果在视图中重定向是没有选择的(为什么),你可以这样做:

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

字符串

xzabzqsa

xzabzqsa4#

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

lo8azlld

lo8azlld5#

我想你可能想在视图代码中做重定向。
例如,这将在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,将按原样用于重定向位置。
nle07wnf

nle07wnf6#

您不会在模板中执行此操作,而是在视图中执行此操作。不调用render_to_response(我假设您现在已经调用了),而是调用HttpResponseRedirect

6pp0gazn

6pp0gazn7#

您可以在Django模板中使用JavaScript中的locationlocation.hreflocation.assign()location.replace()进行重定向,如下所示。* locationlocation.hreflocation.assign()重定向到将记录添加到历史记录的URL,因此我们可以返回到上一页,而location.replace()重定向到未将记录添加到历史记录的URL,因此我们无法返回到上一页:

<script>
{% if not request.user.is_authenticated %}
    location = "{% url '/professional/' %}";
{%endif%}
{% if request.user.get_profile.is_store %}
    location = "{% url '/' %}";
{%endif%}
</script>

x

<script>
{% if not request.user.is_authenticated %}
    location.href = "{% url '/professional/' %}";
{%endif%}
{% if request.user.get_profile.is_store %}
    location.href = "{% url '/' %}";
{%endif%}
</script>
<script>
{% if not request.user.is_authenticated %}
    location.assign("{% url '/professional/' %}");
{%endif%}
{% if request.user.get_profile.is_store %}
    location.assign("{% url '/' %}");
{%endif%}
</script>
<script>
{% if not request.user.is_authenticated %}
    location.replace("{% url '/professional/' %}");
{%endif%}
{% if request.user.get_profile.is_store %}
    location.replace("{% url '/' %}");
{%endif%}
</script>

的数据

相关问题