Django - 如何基于使用privs动态生成菜单

时间:2010-09-24 03:14:26

标签: django django-templates

有没有人知道解决我遇到的其他问题的好方法。我的网站显示基于用户权限的菜单。我有一个函数,将privs作为字典返回如下:

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

我将每个priv传递给包含导航栏的基本模板,并使用简单的{% if priv %}来决定是否要显示菜单项。它工作正常,除了......

我需要在每个视图的上下文中传递priv,因为它们都包含base.html模板和菜单。有很多观点,所以这是愚蠢的。必须有更好的方法!

干杯

2 个答案:

答案 0 :(得分: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变量的上下文。

答案 1 :(得分:2)

添加自定义上下文处理器是不必要的,因为处理器'django.contrib.auth.context_processors.auth'将priveleges附加到上下文中:)

你可以做以下事情:

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