Как проверить (в шаблоне), если пользователь принадлежит к группе

Как проверить шаблон, принадлежит ли пользователь какой-либо группе?

Это возможно в view которое генерирует template но что, если я хочу проверить это в 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 %}

Ответы

Ответ 1

Вам нужен пользовательский тег шаблона:

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/1.9/howto/custom-template-tags/

Ответ 2

В вашем приложении создайте папку "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

После добавления модуля templatetags вам нужно будет перезагрузить сервер, прежде чем вы сможете использовать теги или фильтры в шаблонах.

В вашем base.html (шаблоне) используйте следующее:

{% load auth_extras %}

и проверить, находится ли пользователь в группе "модератор":

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

Документация: https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/

Ответ 3

Я бы сказал, что лучший способ:

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/шаблоны/YourApp/yourtemplate.html:

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

Ответ 4

Следите за тем, что вы получите исключение, если группа не существует в БД.

Пользовательский шаблонный тег должен быть:

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 %}

Ответ 5

В вашем шаблоне

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