2013-09-21 116 views
1

我有一大堆3種不同類型的模型(我有3個抽象基本模型,比如麪包,雞蛋和啤酒)以及許多繼承其中之一的模型)。動態創建Django ModelAdmin類

我想基於它們的抽象基類以不同的方式向管理員註冊具體模型,而不必爲每個類編寫單獨的ModelAdmin類(即,我只想寫3個ModelAdmin類 - 每個類都有一個抽象基類類)。每種類型的混凝土模型都有一組我想要顯示的字段(它們在不同的具體模型上是不同的,但是以一種明確定義的方式,並且我可以很容易地獲得我想在雞蛋模型上顯示的字段列表)。例如:

#abstract base class for Egg 
class Egg(models.Model): 
    fields = ... 

    def get_only_concrete_fields(self): 
     'Return all fields defined on a child of Egg that are not defined on Egg' 
     return concrete_fields 

    class Meta: 
     abstract = True 

#concrete class 
class WhiteEgg(Egg): 
    morefields = ... 

#concrete class 
class BrownEgg(Egg): 
    otherfields = ... 

所以我想要做的就是註冊這兩個WhiteEgg和BrownEgg在管理(無需編寫每個單獨的ModelAdmin類),我想list_display設置get_only_concrete_fields的結果() ,加上一些(不是全部)來自雞蛋的手選領域。我知道他們是一個get_list_display()(請參閱https://stackoverflow.com/a/16115125/710394),但我不認爲它獲取模型,所以我不能調用get_only_concrete_fields()。

我也嘗試循環遍歷下面的模型,爲每個模型定義list_display,並將每個模型註冊爲「base」ModelAdmin,但這不起作用,因爲它只是在循環的每次迭代中重新指定modeladmin。

for models in all_egg_models: 
    modeladmin = MyModelAdmin #or deepcopy(MyModelAdmin) -also doesn't work 
    fieldnames = ...the fields i want... 
    setattr(modeladmin, 'list_display', fieldnames) 
    admin.site.register(model, modeladmin) 

我被困 - 我該怎麼做,幹嗎?

+0

doh。是的,就是這樣。謝謝!你能否將你的評論轉換爲答案,以便我可以接受並給你信用? – andy

回答

0

您認爲重寫get_list_display方法聽起來不錯。

在該方法中,您可以使用self.model訪問該模型。

+0

self.model是我需要的一塊。謝謝! – andy