2011-02-10 9 views
3

すべての子クラスによって継承される抽象モデルクラスにカスタムパーミッションを定義し、そのサブクラス化されたモデルタイプに適用できる汎用オブジェクト名を与えるのではなく、基本的にverbose_name_plural Djangoのデフォルト動作をエミュレートする許可名と説明の一部としての子モデルのプロパティ(例:('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にパッチを当てることはできません)。

+0

これはまだ問題ですが、これより最近の人にとっては曖昧な肯定的なニュースは、この問題が6か月前にいくつかの作業を受けましたが、まだリリースには至っていません(そして1.10 .5執筆時点で)。 https://github.com/django/django/pull/6861#issuecomment-240427426 –

答えて

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

それは古いです - 適切な権限を持つこの抽象モデルを検討し

(ジャンゴ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) 

Permissionsは次のように作成されます。 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'の内容を調べると、' can_change_content_details2'ではなく、 'content_change_content'が' content_change_content'であることが表示されます。 あなた自身の例では、アプリケーション、クラス、および説明テキストのリストだけが表示されています(クラスコンテキスト名を使用すると便利です)。 現在、この同じ問題を自分自身で解決しようとしています。 –

+0

@CarlMarshall私は[既定のアクセス許可](https://docs.djangoproject.com/en/1.10/ref/models/options/#default-permissions)を使用してこれを達成したと思います。ただし、permissions.codenamesは正しく作成されます私はpermission.nameを制御できないようですが、あまり気にしません。 – DrS

0

他の新しい方法は、あなたのベースクラスにメタでdefault_permissionsを設定することです。

マイグレーションを実行して有効にするには、これを実行するときに注意してください。

関連する問題