Django - как динамически генерировать меню на основе использования привилегий - PullRequest
0 голосов
/ 24 сентября 2010

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

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

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

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

Приветствия

Rich

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Добавление пользовательского процессора контекста не нужно, поскольку процессор '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 %}
2 голосов
/ 24 сентября 2010

Один из способов сделать это - написать простой пользовательский шаблонный процессор контекста . Это так же просто, как функция, которая принимает экземпляр 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. Обычно этой переменной нет в настройках. При добавлении убедитесь, что вы скопировали существующего по умолчанию и , а затем добавили его Например,

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...