动态创建Django ModelAdmin类

时间:2013-09-21 15:53:02

标签: python django dynamic

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

我想基于他们的抽象基类以不同的方式注册具体模型,而不必为每一个编写单独的ModelAdmin类(即我只想编写3个ModelAdmin类 - 每个抽象基类一个)。每种类型的具体模型都有一组我想要显示的字段(它们在不同的具体模型上是不同的,但是以明确定义的方式,我可以轻松获得我想要在Egg模型上显示的字段列表)。例如:

#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()的结果,加上一些(不是所有)来自Egg的手工选择的领域。我知道他们是一个get_list_display()(参见https://stackoverflow.com/a/16115125/710394),但我不认为它得到了模型,所以我不能调用get_only_concrete_fields()。

我也试过循环遍历下面的模型,为每个模型定义list_display,并使用“基础”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)

我被困 - 我怎么能这样做,干嘛?

1 个答案:

答案 0 :(得分:0)

您覆盖get_list_display方法的想法听起来不错。

在该方法中,您可以使用self.model访问模型。