2011-02-10 36 views
3

我想定义一些抽象模型类的一些自定义权限,然后将被所有的子类继承,而不是授予一个通用的对象名称,可以适用于任何子类型的模型,我想本质上使用verbose_name_plural儿童模型的属性作为权限名称和描述的一部分(例如('view_classname', 'Can view classname')),模拟Django的默认行为。如何在Django抽象模型类中动态命名权限?

所以,我会希望做的是这样的事情(不工作,因为verbose_name_plural未在此背景下定义):

class AbstractModel(models.Model): 
    class Meta: 
     abstract = True 
     permissions = (
      (u'view_%ss' % verbose_name_plural, u'Can view %s' % verbose_name_plural), 
     ) 

(这个问题也是在http://code.djangoproject.com/ticket/10686描述,其中包括一个修补程序,该修补程序在权限定义中实现了%(class)s的动态替换,但是此修补程序从未被接受,并且我的生产环境不允许修补Django。)

+0

这仍然是一个问题,但对于更近期来临的消息来说,这个问题隐约有利的是,这个问题在6个月前得到了一些工作,但还没有成为一个发布版本(我们在1.10 .5在写作时)。 https://github.com/django/django/pull/6861#issuecomment-240427426 – 2017-02-14 13:01:13

回答

0

您可以使用类装饰器而不是抽象模型类?

def with_view_perm(cls): 
    vn = cls.Meta.verbose_name_plural 
    perms = (('view_%s' % vn, 'Can view %s' % vn),) 
    cls.Meta.perms += perms 
    return cls 

@with_view_perm 
class Child(models.Model): 
    class Meta: 
     verbose_name_plural = 'children' 
     perms = (('change_children', 'Can change children'),) 
0

这是老 - 但以供将来参考 - 期望的行为是工作的开箱现在(Django的1.9)

考虑具有相应权限的这种抽象模型:

class DetailContentLifecycleClassModel (models.Model): 
    class Meta: 
     abstract=True 
     permissions = (
      ('can_change_content', 'Change content of the model'), 
      ('can_submit_for_approval', 'Ask for final check and publishing'), 
      ('can_publish_content', 'Publish the model as a new version'), 
     ) 

当继承如下:

class Test_Details (DetailContentLifecycleClassModel): 
    name = models.CharField(max_length=200) 

class Test_Details2 (DetailContentLifecycleClassModel): 
    name = models.CharField(max_length=200) 

Permssions创建如下G:

from playground.models import Test_Details 
from django.contrib.auth.models import User, Permission 

tmp = Permission.objects.filter() 

结果(这正是被通缉):

playground | test_ details | Can add test_ details 
playground | test_ details | Change content of the model 
playground | test_ details | Publish the model as a new version 
playground | test_ details | Ask for final check and publishing 
playground | test_ details | Can change test_ details 
playground | test_ details | Can delete test_ details 
playground | test_ details2 | Can add test_ details2 
playground | test_ details2 | Change content of the model 
playground | test_ details2 | Publish the model as a new version 
playground | test_ details2 | Ask for final check and publishing 
playground | test_ details2 | Can change test_ details2 
playground | test_ details2 | Can delete test_ details2 
+0

并非如此。调查`auth_permission`的内容将显示`codename`仍然是每个内容类型的原始`can_change_content`,而不是`can_change_content_details2`。 您自己的示例仅显示应用程序,类和描述文本的列表(它们也可以从具有类上下文名称中受益)。 我目前正试图自己解决这个相同的问题。 – 2017-02-14 12:45:48

0

这样做的其他新办法是设置在元default_permissions你的基类。

另外请注意,当你这样做时,你为了使其生效并运行迁移。