2011-02-10 83 views
3

我想定義一些抽象模型類的一些自定義權限,然後將被所有的子類繼承,而不是授予一個通用的對象名稱,可以適用於任何子類型的模型,我想本質上使用verbose_name_plural兒童模型的屬性作爲權限名稱和描述的一部分(例如('view_classname', 'Can view classname')),模擬Django的默認行爲。如何在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 – 2017-02-14 13:01:13

回答

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

這是老 - 但以供將來參考 - 期望的行爲是工作的開箱現在(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創建如下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`的內容將顯示`codename`仍然是每個內容類型的原始`can_change_content`,而不是`can_change_content_details2`。 您自己的示例僅顯示應用程序,類和描述文本的列表(它們也可以從具有類上下文名稱中受益)。 我目前正試圖自己解決這個相同的問題。 – 2017-02-14 12:45:48

0

這樣做的其他新辦法是設置在元default_permissions你的基類。

另外請注意,當你這樣做時,你爲了使其生效並運行遷移。