如何根据用户组更改 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 模板变量值?