有没有办法将Meta权限应用于Django应用程序中的每个模型?

时间:2012-03-30 08:40:14

标签: python django django-models

我想在我的Django应用中为每个模型添加can_view Meta权限。

我想把它添加到models.py

中的每个班级
class Meta:
    permissions = [ ( "can_view", "Can view {something}".format( something = self.verbose_name ) ]

我甚至不确定self.verbose_name在这种情况下是否会像那样工作....

这可能吗?

加分问题:在模型Meta中添加权限后,我可以用has_perm调用它吗?像

if request.user.has_perm( 'polls.can_view' ) :
    # Show a list of polls.
else :
    # Say "Insufficient permissions" or something.    

2 个答案:

答案 0 :(得分:5)

权限也是一个正常的Django模型实例。您可以像任何其他模型一样创建它。

所以你需要像

这样的东西
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

for content_type in ContentType.objects.all():
     Permission.objects.create(content_type=content_type, codename='view_%s' % content_type.model, name='Can view %s' % content_type.name)

你需要做一次,所以post_syncdb信号看起来是个好地方。

答案 1 :(得分:1)

最简单明了的方法是自定义基本模型,它是所有模型的父级。这样你(或其他程序员)就会想知道can_view来自哪里。

class CustomBaseModel(models.Model):
    class Meta:
        abstract = True
        permissions = [ ( "can_view", "Can view {something}".format( something = self.verbose_name ) ]

class SomeModel(CustomBaseModel):
    # ...

但是,这需要您更改所有模型(这可以通过一点点搜索和替换轻松完成),并且不会更改Djangos内置模型(如User)。