3

我想在抽象模型类上定义一些自定义权限,然后由所有子类继承,而不是给权限一个可以应用于任何子类模型类型的通用对象名称,我想基本上使用的verbose_name_plural属性子模型作为权限名称和描述的一部分(例如('view_classname', 'Can view classname')),模拟 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 打补丁.)

4

3 回答 3

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'),)
于 2011-03-17T08:07:45.473 回答
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 创建如下:

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
于 2016-11-13T08:59:41.007 回答
0

另一种较新的方法是在基类的 Meta 中设置 default_permissions。

另请注意,在执行此操作时,您需要进行并运行迁移以使其生效。

于 2018-02-20T13:36:13.023 回答