Django:什么是权限代号?

8
1个回答

13

您可以在Meta类下的任何模型中添加自定义权限。这些权限名称称为codename。操作方式如下:

class Dish(models.Model):
    name = models.CharField()
    class Meta:
        permissions = (
            ('can_approve_dish', "Can approve Dish publication"),
            ('can_delete_dish', "Can Delete Dish")
        )

这里,can_approve_dish 是一个代码名称。现在,要在菜品上执行任何操作,可以像这样检查权限:

# Assuming Dish model is under app named - `'app'`
if user.has_perm('app.can_delete_dish'):
    dish.delete()

这些权限将在迁移后在管理员网站上可用,可以分配给用户。因此,如果您未将can_delete_dish 权限分配给用户,则该用户将无法删除该菜品。

如果您在名为app的应用程序下的多个模型中添加了不同的权限,则所有这些权限都将归为app的名称下。也就是说,您必须在同一应用程序的不同模型之间具有唯一的代码名称。


2
谢谢,现在更清楚了一些。但是can_approve_dish是在哪里定义或执行的还不太清楚。我猜测有一个权限文件,其中包含一个名为DishPermissions的类和一个名为can_approve_dish的方法? - Proto
1
@Proto 它不是一个方法,只是权限的标识符。Django将所有权限添加到auth_permissions表中。并且所有绑定到用户的权限都会添加到user_permissions表中。请查看此链接:https://docs.djangoproject.com/en/1.9/topics/auth/default/#topic-authorization - Rohit Jain
所以看起来,代号实际上是一个任意的名称,用作尚未定义的操作的检查。它不附加到已经定义的任何权限。这正确吗?您提到的“权限”并没有真正澄清什么权限以及如何将代号列表附加到特定操作。文档对我来说也没有更清晰的解释。感谢您的帮助。 - Proto
@Proto 是一个任意的名称而已。你可以选择任何符合 Python 命名规范的名称。 - Rohit Jain
2
我和 OP 一样也遇到了理解上的问题。每个文档/参考都告诉我们如何声明这些权限或检查权限,但没有告诉我们如何规定这些权限名称的作用。难道不应该有一个函数来代表权限吗? - Jay Jung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接