2010-09-24 11 views
0

Кто-нибудь знает, как можно решить эту проблему. На моем сайте отображаются меню, основанные на привилегиях пользователей. У меня есть функция, которая возвращает privs в качестве словаря, как показано ниже:Django - как динамически генерировать меню на основе использования privs

return {"manage_entries":True, "manage_members":False, 
    "manage_something_else":True} 

я прошел в каждых собствах моего базового шаблона, который включает в себя навигационную панель и использовать простой {% if priv %}, чтобы решить, если я собираюсь показать пункт меню или нет. Он отлично работает, за исключением ...

Мне нужно передать конфиденциальность в контексте каждого вида, так как все они включают шаблон base.html и, следовательно, меню. Есть много просмотров, так что это глупо. Должен быть лучший способ!

Приветствия

Rich

ответ

2

Один из способов сделать это, чтобы написать простую custom template context processor. Это так же просто, как функция, которая принимает экземпляр HttpRequest и возвращает словарь. В вашем случае словарь может содержать список привилегий для текущего пользователя.

См., Например,

# This is our processor. 
def append_privileges(request): 
    privileges = get_privs(request.user) 
    return dict(privileges = privileges) 

Где get_privs метод, который возвращает словарь привилегий, как вы указали в своем вопросе.

Теперь добавьте этот процессор в настройку TEMPLATE_CONTEXT_PROCESSORS в settings.py. Обычно эта переменная отсутствует в настройках. Когда вы добавите его, убедитесь, что вы копияexisting default и , а затем прилагается к нему. Напр.

TEMPLATE_CONTEXT_PROCESSORS = (
    # copied from docs. 
    "django.contrib.auth.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.media", 
    "django.contrib.messages.context_processors.messages", 

    # appended custom value 
    "app.utils.append_privileges", 
) 

Наконец, в вашей базе шаблона ожидают переменную privileges.

# I've added a pprint to test. You'll obviously need to do more. 
{{ privileges|pprint }} 

Это позволит убедиться, что все ваши мнения будут автоматически возвращать контекст с правильной privileges переменной.

+0

Благодарит так много Manoj, это кажется идеальным! Я очень ценю, что вы вкладываете свое время в спасение моего! Stackoverflow - отличный инструмент для разработчиков. – Rich

+0

@Rich: рад помочь. Оплатите его вперед :) –

2

Добавление пользовательского контекста процессора unnecesary, так как процессор «django.contrib.auth.context_processors.auth» добавляет в специальных разрешения контекста :)

И вы можете делать такие вещи, как:

{% if perms.foo %} 
    <p>You have permission to do something in the foo app.</p> 
{% if perms.foo.can_vote %} 
    <p>You can vote!</p> 
{% endif %} 
{% if perms.foo.can_drive %} 
    <p>You can drive!</p> 
{% endif %} 
{% else %} 
    <p>You don't have permission to do anything in the foo app.</p> 
{% endif %} 
Смежные вопросы