Как динамически именовать разрешения в классе абстрактной модели Django? - PullRequest
3 голосов
/ 11 февраля 2011

Я хочу определить некоторые пользовательские разрешения для класса абстрактной модели, которые затем будут наследоваться всеми дочерними классами, и вместо того, чтобы дать разрешениям общее имя объекта, которое может применяться к любому типу подклассовой модели, я хотел бы по существу использовать 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.)

Ответы [ 3 ]

0 голосов
/ 13 ноября 2016

Это старое - но для дальнейшего использования - желаемое поведение работает прямо из коробки (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
0 голосов
/ 20 февраля 2018

Другой новый способ сделать это - установить default_permissions в Meta для вашего базового класса.

Также помните, что при этом вы должны выполнять и запускать миграции, чтобы они вступили в силу.

0 голосов
/ 17 марта 2011

Не могли бы вы сделать это с помощью декоратора класса вместо класса абстрактной модели?

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'),)
...