如何在Django中做权限

时间:2014-06-24 15:30:22

标签: django django-permissions

我已经在django中实现了一个权限系统,但它非常基础,我认为可能有更好的方法。

根据我的理解,权限是附加到某些用户的标签,然后由我与之关联的操作取决于我。例如,can_edit只是某些用户可以执行的操作的名称,稍后将由我决定。

我使用命令行为某个模型创建can_edit权限,

from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Group, User, Permission

itmod_ct = ContentType.objects.get(app_label='myapp', model='mymodel')
can_modify = Permission(name='Can Modify', codename='can_modify_model', content_type=itmod_ct)
can_modify.save()
#some group of users g
g.permissions = (can_modify,)
g.save()

然后在模板中,我通过在

中包含相关功能来强制执行它
{% if perms.myapp.can_modify_model %}
... action that can be performed
{% endif %}

这种方法的主要问题是假设我现在实现了一个API,即执行相同操作但没有该模板的东西,那么应用程序就像没有实现所有权限/授权一样。另一个(哲学)问题是在模板中使用业务逻辑。此外,我的大多数观点对所有用户都是通用的,除了一些可以编辑的东西。

1 个答案:

答案 0 :(得分:0)

重新获得某个模型的can_edit权限“......添加','更改'和'删除'权限由Django为每个模型自动创建,因此这可能是多余的

这样做:

{% if perms.issuetracker.can_modify_itmod %}
... action that can be performed
{% endif %}

这没关系,只是因为这不应该是实际执行权限的地方。这只是一些代码,用于决定向用户显示的选项。权限的实际执行将在处理操作的视图中发生。

这取决于您,但通常需要尽可能地将业务逻辑一直推向模型,尽管通常在视图层仍有很多工作要做。您是正确的,不应将业务逻辑留给模板中的代码。