我了解基本的用户资料。我知道身份验证,登录,创建帐户等。但是现在我想处理组和权限。
Django组/权限的文档在哪里?不是吗:http : //docs.djangoproject.com/en/dev/topics/auth/
我了解基本的用户资料。我知道身份验证,登录,创建帐户等。但是现在我想处理组和权限。
Django组/权限的文档在哪里?不是吗:http : //docs.djangoproject.com/en/dev/topics/auth/
Answers:
我想您需要问的第一个问题是您需要什么权限以及什么样的权限。我说的是哪种类型,您想要模型级别还是对象级别。为了澄清差异,假设您有一辆汽车模型。如果要授予所有汽车的权限,则“模型”级别是合适的,但是如果要按汽车授予权限,则需要“对象”级别。您可能同时需要这两个,这不是问题,我们将看到。
对于模型权限,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。