Как проверить (в шаблоне), если пользователь принадлежит к группе
Как проверить шаблон, принадлежит ли пользователь какой-либо группе?
Это возможно в 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 %}