我想您需要问的第一个问题是您需要什么权限以及什么样的权限。我说的是哪种类型,您想要模型级别还是对象级别。为了澄清差异,假设您有一辆Car模型车。如果要授予所有汽车的权限,则“模型”级别是合适的,但是如果要按汽车授予权限,则需要“对象”级别。您可能同时需要这两个,这不是问题,我们将看到。
对于模型权限,Django主要为您处理这些权限。Django将为每个模型以“
appname.permissionname_modelname”形式创建权限。如果您有一个带有Car模型的名为“
drivers”的应用程序,则一个权限为“
drivers.delete_car”。Django自动创建的权限将被创建,更改和删除。由于某些奇怪的原因,他们决定不包括来自CRUD的读取权限,您必须自己执行此操作。请注意,由于某种原因,Django决定将CRUD的“更新”更改为“更改”。要向模型添加更多权限,例如读取权限,请使用meta类:
class Car( models.Model ): # model stuff here class meta: permissions = ( ( "read_car", "Can read Car" ), )
请注意,权限是一组元组,其中元组项是如上所述的权限以及对该权限的描述。您不必遵循permname_modelname约定,但是我通常会坚持使用。
最后,要检查权限,可以使用has_perm:
obj.has_perm( 'drivers.read_car' )
其中obj是User或Group实例。我认为为此编写一个函数更简单:
def has_model_permissions( entity, model, perms, app ): for p in perms: if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ): return False return True
其中实体是要检查(组或用户)权限的对象,模型是模型的实例,权限是作为字符串检查的权限列表(例如[‘read’,’change’]),而app是应用程序名称作为字符串。要执行与上面的has_perm相同的检查,您可以调用以下命令:
result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )
如果您需要使用对象或行权限(它们含义相同),那么Django本身并不能真正为您提供帮助。令人高兴的是,您可以同时使用模型和对象权限。如果您想要对象权限,则必须自己编写(如果使用1.2+)或找到其他人编写的项目,我喜欢的一个是华盛顿时间的django-
objectpermissions。



