如何根据用户更改Django模板';s组?
现在我的网站上有两组不同的用户:客户和企业 现在,我只使用一个登录名,允许两个用户组查看他们的个人资料页面 但是,我只想让客户看到配置文件页面的某些部分,也只想让企业看到这些部分。我怎样才能限制每个小组在此页面上看到的内容如何根据用户更改Django模板';s组?,django,django-templates,django-views,Django,Django Templates,Django Views,现在我的网站上有两组不同的用户:客户和企业 现在,我只使用一个登录名,允许两个用户组查看他们的个人资料页面 但是,我只想让客户看到配置文件页面的某些部分,也只想让企业看到这些部分。我怎样才能限制每个小组在此页面上看到的内容 我应该在模板中使用某种if语句来完成吗?或者有什么其他的解决方案可以让我知道吗?这可能太老了,你不可能再关心它了,但我自己在这里绊倒了,还没有自己弄明白。为了子孙后代,我找到了以下解决方案: 在您的视图中,添加如下内容: is_customer = request.user.
我应该在模板中使用某种if语句来完成吗?或者有什么其他的解决方案可以让我知道吗?这可能太老了,你不可能再关心它了,但我自己在这里绊倒了,还没有自己弄明白。为了子孙后代,我找到了以下解决方案: 在您的视图中,添加如下内容:
is_customer = request.user.groups.filter(name='Customers').exists()
在模板中:
{%if是_customer%}这里的客户资料{%endif%}
它依赖于这样一个事实,即模板中的
if
子句对于空列表的计算结果将为false。我解决这个问题的方法是:
user\u context
中编写函数user\u 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\u local\u admin
只是一个检查用户是否属于管理员组的函数是\u local\u 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 %}
{%if是\u local\u admin%}
你可以看到这个
{%else%}
这里什么都没有
{%endif%}
希望这对别人有帮助。总而言之:看看自定义上下文处理器,它们值得一读。如果您不想向视图函数添加任何内容,并且您正在使用身份验证上下文处理器(
django.contrib.auth.context\u processors.auth
)和RequestContext
,根据,然后,您可以使用以下建议的模板片段:
这有点冗长,但它确实意味着您不必在视图中执行任何操作(除了使用
RequestContext
),也不必编写自定义上下文处理器。我根据发现的内容,通过模板标记实现了这一点。
也许它对某人有用
在utils/utils\u 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" %}
您不应该改用机制吗?您可以将.exists()
添加到filter()
调用的末尾,以获取is\u customer
的实际布尔值。
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" %}
{% if 'group_name' in user.groups.get.name %} do smth {% endif %}