2011-01-02 2 views
10

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

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

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

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

+0

Вы не должны использовать [разрешения] (https://docs.djangoproject.com/en/dev/ref/models/options/# permissions)? –

ответ

10

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

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

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

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

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

+2

Вы можете добавить '.exists()' в конец этого 'filter()' call, чтобы получить фактическое логическое значение для 'is_customer'. – CoreDumpError

12

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

  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 %} 

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

13

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

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

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

7

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

В утилитами/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" %} 
+0

другой вариант: http://stackoverflow.com/a/1052667/573034 – Paolo

Смежные вопросы