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

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

можно в 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 %}

5 ответов


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

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

источник: http://www.abidibo.net/blog/2014/05/22/check-if-user-belongs-group-django-templates/

Docs:https://docs.djangoproject.com/en/1.9/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

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

в своем базы.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/


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

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

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

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

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

в шаблоне

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