如何根据用户组更改Django模板?

时间:2011-01-02 07:07:04

标签: django django-templates django-views

现在我的网站上有两组不同的用户:客户和企业。

现在我只使用一次登录,允许两个用户组查看他们的个人资料页面。

但是,我只希望客户看到配置文件页面的某些部分,而我只希望业务部门看到这些部分。如何限制每个群组在此页面上看到的内容?

我应该在模板中使用某种if语句吗?还是有其他任何人可以让我知道的解决方案?

5 个答案:

答案 0 :(得分:13)

如果您想避免向视图函数中添加任何内容,并且您按照@thyagx’s answer使用了身份验证上下文处理器(django.contrib.auth.context_processors.auth)和RequestContext,那么您可以使用像this Google Groups post中建议的那样的模板片段:

{% for group in user.groups.all %}
    {% if group.name == 'customers' %}
        {% comment %}Customer-specific code goes here{% endcomment %}
    {% endif %}
{% endfor %}

它有点冗长,但它确实意味着您不必在视图中执行任何操作(除了使用RequestContext),或编写自定义上下文处理器。

答案 1 :(得分:12)

这对你来说可能已经太老了,但是在我自己搞清楚之前我自己偶然发现了。对于后代,我找到了以下解决方案:

在您看来,添加以下内容:

is_customer = request.user.groups.filter(name='Customers').exists()

在你的模板中:
{% if is_customer %} customer stuff here {% endif %}

它依赖于以下事实:对于空列表,模板中的if子句将被评估为false。

答案 2 :(得分:12)

我为解决这个问题做了什么:

  1. 我创建了一个自定义上下文处理器,它基本上插入了新变量供您在模板中使用并将其添加到我的设置中。查看更多@ https://docs.djangoproject.com/en/1.3/ref/templates/api/#django.template.RequestContext

    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.core.context_processors.debug',
        'django.core.context_processors.i18n',
        'django.core.context_processors.media',
        'django.core.context_processors.static',
        'django.contrib.auth.context_processors.auth',
        'django.contrib.messages.context_processors.messages',
        'common.user_context.user_context'
    )
    
  2. 我继续在文件user_context中编写函数user_context,我的是这样的:

    def user_context(request):
        if request.user.is_authenticated():
            is_admin = is_local_admin(request.user)
        else:
            is_admin = False
    
        return {
            'is_local_admin': is_admin
        }
    

    is_local_admin只是一个检查用户是否属于Admins组的函数。

  3. 每当我在模板中需要此is_local_admin信息时,我都会使用此信息在我的视图中进行渲染,例如:

    return render_to_response('create_user.html', {
        'form': form
    }, context_instance=RequestContext(request))
    
  4. 重要的部分是RequestContext,它加载我们在步骤1中构建的自定义上下文处理器。

    现在,您可以在模板中使用:

    {% if is_local_admin %}
        <h1>You can see this</h1>
    {% else %}
        <h1>Nothing here</h1>
    {% endif %}
    

    希望这有助于某人。总结:看看自定义上下文处理器,值得一读。

答案 3 :(得分:7)

我是根据我找到的here通过模板标记实现的。 也许它对某人有用。

在utils / utils_extras.py中:

from django import template
from django.contrib.auth.models import Group

register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
    try:
        group = Group.objects.get(name=group_name)
    except:
        return False  # group doesn't exist, so for sure the user isn't part of the group

    # for superuser or staff, always return True
    if user.is_superuser or user.is_staff:
        return True

    return user.groups.filter(name=group_name).exists()

然后在模板中:

{% load utils_extras %}
{% if user|has_group:"mygroup" %}

答案 4 :(得分:0)

{% if  'group_name' in user.groups.get.name %} do smth {% endif %}