我有一大堆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)
我被困 - 我該怎麼做,幹嗎?
doh。是的,就是這樣。謝謝!你能否將你的評論轉換爲答案,以便我可以接受並給你信用? – andy