如何根据用户更改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 %}