Django模块的用户权限
我在Django模板中遇到了一个小问题,关于权限的设置。
我想根据用户的权限,在项目的菜单栏中显示一个图标。如果用户有权限添加新的跟进记录,就显示这个图标;如果没有这个权限,就不显示这个链接。
我的权限语法是 follow.add_followup
,这个是我通过打印 user.get_all_permissions()
得到的。
我在模板中尝试了以下代码:
...
{% if user.has_perm('followup.add_followup') %}
<li><a href="{% url followup-new p.id %}">Log</a></li>
{% endif %}
...
但是当我显示这个模板时,出现了一个错误:
在 /project/232/view/ 处出现了模板语法错误:
无法解析剩余部分: '(followup.add_followup)' 来自 'user.has_perm(followup.add_followup)'
有什么想法吗?这让我很头疼! :)
4 个回答
Django的文档中详细说明了答案#2: https://docs.djangoproject.com/en/dev/topics/auth/#id9
当前登录用户的权限信息保存在模板变量 {{ perms }} 中。这个变量是 django.contrib.auth.context_processors.PermWrapper 的一个实例,它是一个方便在模板中使用的权限代理。
因为你在使用Django的权限系统,所以最好使用下面的模板语法...
{%if perms.followup.add_followup%}your URL here{%endif%}
编辑:Django会自动为每个模型创建三个权限,分别是'添加'、'修改'和'删除'。如果没有模型可以用来添加链接,那么你必须从相关模型中添加权限,在模型类的Meta里面...同样:
somemodels.py
class SomeModel(Model):
...
class Meta:
permissions = (('add_followup','Can see add urls'),(...))
在Django的用户管理页面,你可以看到你的权限。在模板层面,权限会以Django的基本样式呈现,
<app_label>.<codename>
在这种情况下,会像这样:
{%if perms.somemodels.add_followup%}your URL here{%endif%}
如果没有与您想做的工作相关的模型,那么就要把权限添加到一个模型中...
在你的模板中,你可以写
{{perms.somemodels}}
来显示该用户可用的权限,其中somemodel
是你添加权限的模型所在的应用名称。
我在我的模板中试过这个代码:
这种复杂的决策过程应该放在视图函数里。
或者放在上下文中,然后再呈现给模板。
https://stackoverflow.com/search?q=%5Bdjango%5D+context
在你的视图中这样做:
def my_view( request ):
followup= user.has_perm('followup.add_followup')
# etc.
return render_to_response( template, {'followup':followup,... )
然后你的模板就简单了:
{% if followup %}
<li><a href="{% url followup-new p.id %}">Log</a></li>
{% endif %}