Python 动态创建Django ModelAdmin类

Python 动态创建Django ModelAdmin类,python,django,dynamic,Python,Django,Dynamic,我有一大堆3种不同类型的模型(我有3个抽象的基础模型,比如面包、鸡蛋和啤酒),还有很多继承了这三种模型之一的模型) 我想根据抽象基类的不同向管理员注册具体模型,而不必为每个模型编写单独的ModelAdmin类(即我只想编写3个ModelAdmin类,每个抽象基类一个)。每种类型的具体模型都有一组我想要显示的字段(它们在不同的具体模型上是不同的,但以一种定义良好的方式,我可以很容易地获得我想要在鸡蛋模型上显示的字段列表)。例如: #abstract base class for Egg class

我有一大堆3种不同类型的模型(我有3个抽象的基础模型,比如面包、鸡蛋和啤酒),还有很多继承了这三种模型之一的模型)

我想根据抽象基类的不同向管理员注册具体模型,而不必为每个模型编写单独的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 = ...
因此,我要做的是在admin中注册WhiteEgg和BrownEgg(无需为每一个都编写单独的modeladmin类),并将list_display设置为get_only_concrete_fields()的结果,再加上几个(不是全部)来自Egg的手工选择字段。我知道它们是一个get_list_udisplay()(请参阅),但我认为它没有得到模型,所以我不能只调用get_u具体的字段()

我也尝试过在下面这样的模型上循环,为每个模型定义列表显示,并使用“基本”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)

我被卡住了-我如何才能做到这一点,并将其晾干?

您覆盖
get\u list\u display
方法的想法听起来不错


在该方法中,您可以使用
self.model

doh访问模型。是的,就是这样。谢谢你能不能把你的评论换成一个答案,这样我就可以接受它,并给你信用?