4

是否可以从 Django 中的抽象模型继承权限?我真的找不到任何关于那的东西。对我来说这行不通!

class PublishBase(models.Model): 
    class Meta:
        abstract = True
        get_latest_by = 'created'
        permissions = (('change_foreign_items',
                        "Can change other user's items"),)

编辑:不工作意味着它默默地失败。未创建权限,因为从此类继承的模型上不存在权限。

4

6 回答 6

10

如果子类也定义了自己的class Meta. 我找到了以下解决方法,它可以避免在每个子模型上再次定义权限:

class AbstractBaseModel(models.Model):
    class Meta:
        abstract = True
        permissions = (("test_permission","test permission"),)


class SomeClass(AbstractBaseModel):
    name = models.CharField(max_length=255,verbose_name="Name")

    class Meta(AbstractBaseModel.Meta):
        verbose_name = ....

无需在子 Meta 类中将 abstract 设置为 false,因为 Django 在处理它时将其在父级中设置为 False!http://docs.djangoproject.com/en/dev/topics/db/models/#meta-inheritance

于 2010-06-09T14:37:18.950 回答
2

这是解决您问题的链接:http ://code.djangoproject.com/ticket/10686 需要应用补丁...但它确实有效。

于 2010-06-05T19:18:55.427 回答
2

看看下面的元实现,它为所有将 MyModelMeta Class 设置为元类的 django 模型添加了读取权限

class MyModelMeta(ModelBase):
    # add a read permission to each MyModelMeta model
    def __new__(cls, name, bases, attrs):

        Meta = None

        if "Meta" in attrs:
            Meta = attrs.get("Meta")
            if hasattr(Meta, "abstract") and getattr(Meta, "abstract"):
                # if the class is abstract, don't create permissions for it, just return the class object            
                return super(MyModelMeta, cls).__new__(cls, name, bases, attrs)

        if not Meta:
            # create a new Meta Class
            Meta = type('Meta', (object,), {})

        setattr(Meta, 'permissions',(("read_%s"%name.lower(), "Can read %s"%name.lower()),))
        attrs['Meta'] = Meta
        return super(MyModelMeta, cls).__new__(cls, name, bases, attrs)        

创建一个抽象的 django 模型并将元类成员设置为 MyModelMeta:

class MyAbstractModel(models.Model):
    __metaclass__ = MyModelMeta

    class Meta:
        abstract=True

现在,像这样创建一个普通的 django 模型:

class SomeModel(MyAbstractModel):
    someFieldName = models.CharField(max_length=256, db_index=True)

这将生成默认的 add/change/delete_somemodel 权限,但也会添加新的 read_somemodel 权限。

如果您也在使用 south,请使用它来生成额外的权限:

from django.db.models import get_app, get_models
from django.contrib.auth.management import create_permissions

create_permissions(get_app(app), get_models(), 2 if settings.DEBUG else 0)
于 2014-10-23T13:49:17.450 回答
2

我的解决方法:

class AbstractModelBase(models.base.ModelBase):

    def __new__(cls, name, bases, attrs):
        new = super(AbstractModelBase, cls).__new__(cls, name, bases, attrs)
        new._meta.permissions += (("abstract_permission", "Abstract permission"),)
        return new


class AbstractModel(models.Model):
    __metaclass__ = AbstractModelBase

    class Meta:
        abstract = True
于 2012-05-22T22:40:41.387 回答
1

我为您的问题编写测试。我使用 django 1.2.1,结果很好!

如果要从继承模型向现有模型添加权限,则每次更改它们时都需要运行“syncdb”。示例 100% 有效。(在 1.2.1 中没有补丁)

现在可以了。

替代文字 http://img203.imageshack.us/img203/7500/permn.png

例子:

from django.db import models
from django.contrib import admin

class permissions(models.Model):
    class Meta:
        abstract = True
        permissions = (("test_permission","test permission"),)


class SomeClass(permissions):
    name = models.CharField(max_length=255,verbose_name="Name")

admin.site.register(SomeClass)
于 2010-06-05T20:25:49.040 回答
0

在我的情况下,由于 South,显式继承Meta不起作用。看这张票

django-admin.py syncdb --all解决了这个问题。

于 2013-12-03T21:49:03.050 回答