Как мне изменить шаблон Django на основе группы пользователей? - PullRequest
11 голосов
/ 02 января 2011

Сейчас у меня на сайте есть две разные группы пользователей: клиенты и компании.

Сейчас я использую только один логин, который позволяет обеим группам пользователей видеть страницу своего профиля.

Однако есть части страницы профиля, которые я только хочу, чтобы клиент видел, и части, которые я хочу видеть только компании.Как я могу ограничить то, что каждая группа видит на этой странице?

Должен ли я сделать это в шаблоне с каким-то оператором if?или есть какое-то другое решение, о котором кто-нибудь может сообщить мне?

Ответы [ 4 ]

13 голосов
/ 07 июня 2013

Если вы хотите избежать добавления чего-либо к функциям представления и используете контекстный процессор аутентификации (django.contrib.auth.context_processors.auth) и RequestContext согласно @ thyagx's answer , тогда вы можете использоватьфрагмент шаблона, подобный предложенному в этом сообщении групп Google :

{% for group in user.groups.all %}
    {% if group.name == 'customers' %}
        {% comment %}Customer-specific code goes here{% endcomment %}
    {% endif %}
{% endfor %}

Это немного многословно, но это означает, что вам не нужно ничего делать по вашему мнению (кроме использованияRequestContext), или написать пользовательский контекстный процессор.

12 голосов
/ 12 января 2012

Что я сделал, чтобы решить эту проблему:

  1. Я создал пользовательский контекстный процессор, который в основном вставляет новые переменные для использования в ваших шаблонах, и добавил его в мои настройки.Подробнее @ 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'
    )
    
  2. Я продолжал писать функцию 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 - это просто функция, которая проверяет, принадлежит ли пользователь группе администраторов.

  3. Всякий раз, когда мне нужна эта 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 %}

Надеюсь, это кому-нибудь поможет.В итоге: взгляните на пользовательские контекстные процессоры, они того стоят.

12 голосов
/ 02 июня 2011

Это, вероятно, слишком стар для вас, чтобы беспокоиться больше, но я споткнулся здесь сам, прежде чем выяснить это самостоятельно. Для потомков я нашел следующее решение:

На ваш взгляд, добавьте что-то вроде этого:

is_customer = request.user.groups.filter(name='Customers').exists()

В вашем шаблоне:
{% if is_customer %} customer stuff here {% endif %}

Он основан на том факте, что предложение if в шаблоне будет оценено как ложное для пустого списка.

7 голосов
/ 26 ноября 2014

Я реализовал это через тег шаблона, основываясь на том, что нашел здесь . Возможно, это кому-нибудь пригодится.

В 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" %}
...