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

Posted

技术标签:

【中文标题】如何根据用户组更改 Django 模板?【英文标题】:How do I change a Django Template based on the User's Group? 【发布时间】:2011-06-02 10:15:24 【问题描述】:

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

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

但是,我只希望客户看到个人资料页面的某些部分,而我只希望企业看到某些部分。如何限制每个组在此页面上看到的内容?

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

【问题讨论】:

你不应该使用permissions机制吗? 【参考方案1】:
% if  'group_name' in user.groups.get.name % do smth % endif %

【讨论】:

【参考方案2】:

这可能对你来说太老了,不能再关心了,但我自己在这里偶然发现,然后才自己弄清楚。为了后代,我找到了以下解决方案:

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

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

在您的模板中: % if is_customer % customer stuff here % endif %

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

【讨论】:

您可以将.exists() 添加到filter() 调用的末尾以获得is_customer 的实际布尔值。【参考方案3】:

我通过模板标签实现了这一点,基于我发现的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】:

我为解决这个问题所做的是:

    我创建了一个自定义上下文处理器,它基本上插入新变量供您在模板中使用,并将其添加到我的设置中。查看更多@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'
    )
    

    我接着在文件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 组的函数。

    每当我需要模板中的is_local_admin 信息时,我都会使用它在我的视图中呈现它,例如:

    return render_to_response('create_user.html', 
        'form': form
    , context_instance=RequestContext(request))
    

重要的部分是RequestContext,它会加载我们在步骤 1 中构建的自定义上下文处理器。

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

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

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

以上是关于如何根据用户组更改 Django 模板?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 javascript 代码中更改 django 模板变量值?

django更改管理视图(无模型)

如何将 is_staff 用户重定向到 Django 中的自定义模板?

如何通过按钮更改 Django 模板使用的 CSS?

根据用户的属性迭代 Django 模板中的上下文变量

根据 django 项目中的用户更改时区