2010-09-24 393 views
0

有没有人知道解决我有其他问题的好方法。我的网站显示基于用户权限的菜单。我有一个返回PRIVS作为字典如下功能:Django - 如何根据使用权限动态生成菜单

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

我在每个私法传递给包括导航栏和使用简单的{% if priv %}来决定,如果我要显示菜单项我的基本模板或不。它工作正常,除了...

我需要在每个视图的上下文中传递privs,因为它们都包含base.html模板和菜单。有很多意见,所以这是愚蠢的。一定会有更好的办法!

干杯

丰富做到这一点

回答

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是返回特权字典的方法,如您在问题中指出的那样。

现在将此处理器添加到您的settings.py中的TEMPLATE_CONTEXT_PROCESSORS设置中。通常这个变量不存在于设置中。当你添加它时,请确保你拷贝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

太感谢很多马诺吉,这似乎是完美的!我真的很感谢你把你的时间节省下来! Stackoverflow对于开发者来说是一个了不起的工具。 – Rich 2010-09-24 08:46:08

+0

@ Rich:很高兴帮助。支付它:) – 2010-09-24 08:56:07

2

添加自定义背景处理器是unnecesary,因为处理器的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 %}