Как изменить шаблон Django на основе группы пользователей?
сейчас у меня есть две разные группы пользователей на моем сайте: клиентов и бизнеса.
сейчас я использую только один логин, который позволяет обеим группам пользователей видеть свою страницу профиля.
тем не менее, есть части страницы профиля, которые я хочу видеть только клиент, и части, которые я хочу видеть только бизнес. Как я могу ограничить то, что каждая группа видит на этой странице?
должен ли я делать это в шаблоне с каким-то оператором if? или есть ли какое-то другое решение, о котором кто-нибудь может сообщить мне?
4 ответов
на ваш взгляд, добавить что-то вроде этого:
is_customer = request.user.groups.filter(name='Customers').exists()
в вашем шаблоне:
{% if is_customer %} customer stuff here {% endif %}
Это зависит от того, что if
предложение в шаблоне будет равно false для пустого списка.
если вы хотите избежать добавления чего-либо в свои функции просмотра, и вы используете контекстный процессор auth (django.contrib.auth.context_processors.auth
) и RequestContext
по состоянию на @thyagx это, тогда вы можете использовать фрагмент кода шаблона, как это предложено в это сообщение Google групп:
{% for group in user.groups.all %}
{% if group.name == 'customers' %}
{% comment %}Customer-specific code goes here{% endcomment %}
{% endif %}
{% endfor %}
это немного многословно, но это означает, что вам не нужно ничего делать в своем представлении (кроме использования RequestContext
) или написать собственный контекст процессора.
что я сделал, чтобы решить это:
-
Я создал пользовательский контекст процессор, который в основном добавляет новые переменные для использования в шаблонах и добавил его в Мои настройки. Подробнее @ 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
- это просто функция, которая проверяет, если пользователь принадлежит к группе администраторов или нет. -
всякий раз, когда мне это нужно
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 %}
Надежда это кому-то помогает. В заключение:взгляните на пользовательские контекстные процессоры, их стоит прочитать.
я реализовал это через тег шаблона, основанный на том, что я нашел здесь. Может быть, это кому-то пригодится.
In 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" %}