Django模块的用户权限

3 投票
4 回答
9659 浏览
提问于 2025-04-16 11:10

我在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 个回答

2

Django的文档中详细说明了答案#2: https://docs.djangoproject.com/en/dev/topics/auth/#id9

当前登录用户的权限信息保存在模板变量 {{ perms }} 中。这个变量是 django.contrib.auth.context_processors.PermWrapper 的一个实例,它是一个方便在模板中使用的权限代理。

11

因为你在使用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是你添加权限的模型所在的应用名称。

1

我在我的模板中试过这个代码:

这种复杂的决策过程应该放在视图函数里。

或者放在上下文中,然后再呈现给模板。

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

撰写回答