有没有人知道解决我遇到的其他问题的好方法。我的网站显示基于用户权限的菜单。我有一个函数,将privs作为字典返回如下:
return {"manage_entries":True, "manage_members":False,
"manage_something_else":True}
我将每个priv传递给包含导航栏的基本模板,并使用简单的{% if priv %}
来决定是否要显示菜单项。它工作正常,除了......
我需要在每个视图的上下文中传递priv,因为它们都包含base.html模板和菜单。有很多观点,所以这是愚蠢的。必须有更好的方法!
干杯
富
答案 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 %}