Как изменить шаблон Django на основе группы пользователей?
Сейчас у меня на моем сайте две разные группы пользователей: клиенты и предприятия.
Сейчас я использую только один логин, который позволяет обеим группам пользователей видеть свою страницу профиля.
Однако есть части страницы профиля, которые я хочу видеть только клиенту, и части, которые я хочу видеть только в бизнесе. Как я могу ограничить то, что каждая группа видит на этой странице?
Должен ли я сделать это в шаблоне с каким-то выражением if? или есть какое-то другое решение, о котором каждый может сообщить?
Ответы
Ответ 1
Это, вероятно, слишком старо, чтобы вы могли больше заботиться, но я тут же споткнулся, прежде чем разобраться с этим сам. Для потомков я нашел следующее решение:
По-вашему, добавьте что-то вроде этого:
is_customer = request.user.groups.filter(name='Customers').exists()
В вашем шаблоне:
{% if is_customer %} customer stuff here {% endif %}
Он полагается на то, что предложение if
в шаблоне будет оцениваться как false для пустого списка.
Ответ 2
Если вы хотите не добавлять что-либо к своим функциям просмотра, а вы используете обработчик контекста (django.contrib.auth.context_processors.auth
) и RequestContext
в соответствии с @thyagxs answer, то вы можете использовать фрагмент шаблона, подобный предложенному в этой странице Google Groups:
{% for group in user.groups.all %}
{% if group.name == 'customers' %}
{% comment %}Customer-specific code goes here{% endcomment %}
{% endif %}
{% endfor %}
Немного подробный, но это означает, что вам не нужно что-либо делать в своем представлении (кроме использования RequestContext
) или написать собственный обработчик контекста.
Ответ 3
Что я сделал для решения этой проблемы:
-
Я создал специальный обработчик контекста, который в основном вставляет новые переменные для использования в ваших шаблонах и добавляет их в мои настройки. Подробнее @https://docs.djangoproject.com/en/1.3/ref/templates/api/#django.template.RequestContext:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'common.user_context.user_context'
)
-
Я продолжал писать функцию user_context
внутри файла user_context
, мой вот так:
def user_context(request):
if request.user.is_authenticated():
is_admin = is_local_admin(request.user)
else:
is_admin = False
return {
'is_local_admin': is_admin
}
is_local_admin
- это просто функция, которая проверяет, принадлежит ли пользователь группе Admins или нет.
-
Всякий раз, когда мне нужна эта информация is_local_admin
в моем шаблоне, я использую ее для рендеринга в моем представлении, например:
return render_to_response('create_user.html', {
'form': form
}, context_instance=RequestContext(request))
Важной частью является RequestContext
, которая загружает обработчик пользовательского контекста, который мы создаем на шаге 1.
Теперь в вашем шаблоне вы можете просто использовать:
{% if is_local_admin %}
<h1>You can see this</h1>
{% else %}
<h1>Nothing here</h1>
{% endif %}
Надеюсь, это поможет кому-то. Вкратце: взглянуть на пользовательские процессоры контекста, их стоит прочитать.
Ответ 4
Я реализовал это через тег шаблона, основанный на том, что я нашел здесь.
Возможно, это может быть полезно кому-то.
В utils/utils_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):
try:
group = Group.objects.get(name=group_name)
except:
return False # group doesn't exist, so for sure the user isn't part of the group
# for superuser or staff, always return True
if user.is_superuser or user.is_staff:
return True
return user.groups.filter(name=group_name).exists()
Затем в самом шаблоне:
{% load utils_extras %}
{% if user|has_group:"mygroup" %}