我了解基本的用户内容。我知道身份验证、登录、创建帐户等。但现在我想处理组和权限。
django 组/权限的文档在哪里?这不是它:http ://docs.djangoproject.com/en/dev/topics/auth/
我了解基本的用户内容。我知道身份验证、登录、创建帐户等。但现在我想处理组和权限。
django 组/权限的文档在哪里?这不是它:http ://docs.djangoproject.com/en/dev/topics/auth/
我想你需要问的第一个问题是你需要什么权限以及什么类型。我的意思是你想要模型级还是对象级。为了澄清差异,说你有一辆模型车。如果你想授予所有汽车的权限,那么模型级别是合适的,但如果你想在每辆车的基础上授予权限,你需要对象级别。您可能需要两者,这不是我们将看到的问题。
对于模型权限,Django 会为您处理这些……主要是。对于每个模型,Django 将以“appname.permissionname_modelname”的形式创建权限。如果您有一个名为“drivers”的应用程序,该应用程序具有 Car 模型,那么一个权限将是“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
其中 entity 是要检查(组或用户)权限的对象,model 是模型的实例,perms 是要检查的字符串形式的权限列表(例如 ['read', 'change']),app 是应用程序名称作为字符串。要进行与上面的 has_perm 相同的检查,您可以调用如下内容:
result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )
如果您需要使用对象或行权限(它们的含义相同),那么 Django 本身并不能真正帮助您。好处是您可以同时使用模型和对象权限。如果您想要对象权限,您必须自己编写(如果使用 1.2+)或找到其他人编写的项目,我喜欢的一个是来自华盛顿时报的django-objectpermissions。