如何检查(在模板中)用户是否属于某个组

How to check (in template) if user belongs to a group

如何在模板中检查用户是否属于某个组?

在生成 templateview 中是可能的,但是如果我想在 base.html 中检查它,它是一个扩展模板(它没有自己的模板)查看函数)?

我的所有模板都扩展了 base.html,所以在每个 view 中检查它并不好。

base.html 包含上部栏,其中应包含按钮,具体取决于 group 登录用户所在的位置(客户、卖家)。

在我的base.html中是:

{% if user.is_authenticated %}

这还不够,因为我必须对来自 Customers 的用户和来自 Sellers 的用户采取不同的行动。

所以我想要的是:

{% if user.in_group('Customers') %}
 <p>Customer</p>
{% endif %}
{% if user.in_group('Sellers') %}
<p>Seller</p>
{% endif %}

您需要自定义模板标签:

from django import template

register = template.Library() 

@register.filter(name='has_group') 
def has_group(user, group_name):
    return user.groups.filter(name=group_name).exists() 

在您的模板中:

{% if request.user|has_group:"mygroup" %} 
    <p>User belongs to my group 
{% else %}
    <p>User doesn't belong to mygroup</p>
{% endif %}

来源:http://www.abidibo.net/blog/2014/05/22/check-if-user-belongs-group-django-templates/

文档:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

在您的应用中创建一个文件夹 'templatetags'。在此文件夹中创建两个文件:

__init__.py

auth_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): 
    group = Group.objects.get(name=group_name) 
    return True if group in user.groups.all() else False

现在应该是这样的:

app/
    __init__.py
    models.py
    templatetags/
        __init__.py
        auth_extras.py
    views.py

After adding the templatetags module, you will need to restart your server before you can use the tags or filters in templates.

在您的 base.html(模板)中使用以下内容:

{% load auth_extras %}

并检查用户是否在组 "moderator":

{% if request.user|has_group:"moderator" %} 
    <p>moderator</p> 
{% endif %}

文档:https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/

在您的模板中

{% ifequal user.groups.all.0.name "user" %}
  This is User
{% endifequal %}
  

请注意,如果该组在数据库中不存在,您将得到一个异常。

自定义模板标签应该是:

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 Group.DoesNotExist:
        return False

    return group in user.groups.all()

您的模板:

{% if request.user|has_group:"mygroup" %} 
    <p>User belongs to my group 
{% else %}
    <p>User doesn't belong to mygroup</p>
{% endif %}

我认为最好的方法是:

yourapp/templatetags/templatetagname.py

from django import template

register = template.Library()

@register.filter(name='has_group')
def has_group(user, group_name):
    return user.groups.filter(name=group_name).exists()

yourapp/templates/yourapp/yourtemplate.html:

{% load has_group %}

{% if request.user|has_group:"mygroup" %} 
    <p>User belongs to my group</p>
{% else %}
    <p>User does not belong to my group</p>
{% endif %}

编辑:按照评论中的建议添加了带有模板标签加载的行。

EDIT2:修复了小错字。

{% if target_group in user.groups.all.0.name %}
    # do your stuff
{% endif %}

虽然mishbah给出的答案是对的,但是对我没用。

我正在使用 Django 2.2.7,我发现 register = template.Library() 应该替换为 from django.template.defaultfilters import register

我希望有人会发现它有用。

你可以使用这个:

{% for group_for in request.user.groups.all %}
    {% if group_for.name == 'Customers' %}
        Text showed to users in group 'Customers'
    {% elif group_for.name == 'Sellers' %}
        Text showed to users in group 'Sellers'
    {% endif %}
{% endfor %}

这是遍历与发出请求的用户相关的组,如果迭代组的名称等于 'Customers'、'Sellers' 等

,则打印文本

我发现的最简单的方法是使用 context_preprocessor

将所有组名称添加到上下文中

在您的应用中创建一个文件 context_processors.py 并添加以下内容:

def user_groups_processor(request):
    groups = []
    user = request.user
    if user.is_authenticated:
        groups = list(user.groups.values_list('name',flat = True))
    return {'groups': groups}

在您的设置中,添加新的上下文处理器

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
             "context_processors": [
                "my_app.context_processors.user_groups_processor"
            ],
        },
    },
]

或者如果您更喜欢 settings.py

TEMPLATES[0]['OPTIONS']['context_processors'].append("my_app.context_processors.user_groups_processor")

之后,您可以在模板中使用:

{% if 'vip' in groups %}
  <p>Paragraph only visible to VIPs</p>
{% endif %}

首先你需要在里面定义一个自定义的过滤函数has_group.py

from django import template
from xx.models import Xuser


register = template.Library()


@register.filter(name='has_group')
def has_group(user, group_name):
    try:
        group = Xuser.objects.get(email=user.email)
        if group.role == group_name:
            return True
        else:
            return False
    except Xuser.DoesNotExist:
        return False

    return group

 

django settings.py文件中你需要添加

 'libraries': {
                'my_templatetag': 'xx.templates.has_group',

            },

里面TEMPLATES = []

然后添加

{% load my_templatetag %}

在你的 example.html

最后

{% if user|has_group:"admin" %} 
 {% endif %}

在我的例子中,问题是,我使用的是 {% load filter_method_name %}

我不得不改成{% load filename %}

例如,

app/
    __init__.py
    models.py
    templatetags/
        __init__.py
        auth_extras.py
    views.py

此处,模板 taq 将为 {% load auth_extras %}

然后我不得不重新启动服务器。