如何在Django中创建自定义权限(用户角色)?

6 投票
2 回答
13438 浏览
提问于 2025-04-16 06:19

我有个简单的问题。怎么在Django里创建用户角色,而不需要手动在数据库里创建呢?

补充:我需要创建一个特定的权限。这样只有拥有这个权限的用户才能修改模型的某个特定字段。我只需要让某些用户的一个字段变成“只读”。在Django里可以做到吗?

2 个回答

0

你可以看看 django-authority。这个工具可以让你实现对特定对象的权限控制,甚至可以进行一些逻辑判断。逻辑判断并不是存储在数据库里的,而是一些可以接收值并返回 TrueFalse 的函数。顺便提一下,我的一个版本实现了django 1.2的对象权限后端,所以你可以像这样使用:userA.hasperm("see_xyz")

7

如果你想创建一个权限,但不想使用数据库,那就意味着你不想用Django的权限系统。在这种情况下,我想问问你,为什么不想用它呢?

如果你愿意使用Django的权限系统,你可以创建一个权限,并通过重写管理员的保存方法来检查这个权限……比如说:

在你的 models.py 文件中

class SomeModel(Model):
    your_spec_field = FieldType(...)
    class Meta:
        permissions = (
            ("some_perm", u"A name for your default permission"),
        )

在你相关的 admin.py 文件中

class SomeModelAdmin(ModelAdmin):
    def save_model(self, request, obj, form, change):
        if change:
            curr_value = SomeModel.objects.get(pk=obj.id)
            if not request.user.has_perm('<your_app>.some_perm'):
                obj.your_spec_field = curr_value.your_spec_field
        else:
            if not request.user.has_perm('<your_app>.some_perm')
                obj.your_spec_field = '' # or the default value according to your field type
        obj.save()

这种方法的意思是,在你保存记录之前,先获取相关记录的状态,并检查相关的权限。如果用户没有所需的权限,那么你就把字段的值替换成之前的值。如果这是一个新记录,那么你可以把那个字段设置为你想要的任何值。

撰写回答