首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Django组和权限?

如何使用Django组和权限?
EN

Stack Overflow用户
提问于 2011-01-24 12:36:13
回答 1查看 43.8K关注 0票数 84

我理解基本的用户知识。我知道身份验证、登录、创建帐户等,但现在我想处理组和权限。

django组/权限的文档在哪里?不是这样的:http://docs.djangoproject.com/en/dev/topics/auth/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-25 01:19:15

我想你需要问的第一个问题是你需要什么权限和哪种权限。我的意思是,你想要模型级还是对象级。为了弄清楚区别,假设你有一辆模型车。如果您想在所有汽车上授予权限,那么Model-level是合适的,但如果您希望在每个汽车的基础上授予权限,则需要对象级别。您可能两者都需要,正如我们将看到的,这不是问题。

对于模型权限,Django会为您处理这些权限...多半是。对于每个模型,Django将以'appname.permissionname_modelname‘的形式创建权限。如果你有一个名为'drivers‘的应用程序和汽车型号,那么一个权限将是'drivers.delete_ Car’。Django自动创建的权限包括创建、更改和删除。出于某种奇怪的原因,他们决定不包含CRUD的读取权限,您将不得不自己执行此操作。请注意,Django出于某种原因决定将CRUD的“update”更改为“change”。要向模型添加更多权限,例如读取权限,可以使用Meta类:

代码语言:javascript
复制
class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

请注意,权限是一组元组,其中元组项目是如上所述的权限和该权限的描述。您不必遵循permname_modelname约定,但我通常会坚持使用它。

最后,要检查权限,可以使用has_perm:

代码语言:javascript
复制
obj.has_perm( 'drivers.read_car' )

其中,obj是用户实例或组实例。我认为为此编写一个函数会更简单:

代码语言:javascript
复制
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相同的检查,您可以调用类似下面的代码:

代码语言:javascript
复制
result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

如果您需要使用对象或行权限(它们的含义相同),那么Django本身并不能真正帮助您。好的是你可以同时使用模型权限和对象权限。如果你想要对象权限,你必须要么使用write your own (如果使用1.2+),要么找到别人写的项目,我喜欢的一个是来自华盛顿时报的django-objectpermissions

票数 121
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4778685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档