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 = ....

Djangoは処理時に親でFalseに設定するため、子Metaクラスでabstractを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

私の回避策:

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 に答える
2

次のメタ実装を見てください。MyModelMetaクラスをメタクラスに設定するすべての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モデルを作成し、メタクラスmemeberを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権限も追加されます。

南も使用している場合は、これを使用して追加の権限を生成します。

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 に答える
1

私はあなたの問題のテストを書きます。私はdjango1.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

私の場合、明示的に継承するMetaことは南のために機能しませんでした。このチケットを参照してください。

django-admin.py syncdb --all問題を修正しました。

于 2013-12-03T21:49:03.050 に答える