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