【问题标题】:create Django ModelAdmin classes dynamically动态创建 Django ModelAdmin 类
【发布时间】:2013-09-26 21:27:17
【问题描述】:

我有一大堆 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 注册每个模型,但这不起作用,因为它只是在循环的每次迭代中重新分配该模型管理员。

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)

我被卡住了 - 我该怎么做,然后干?

【问题讨论】:

  • 哦。是的,就是这样。谢谢!您可以将您的评论转换为答案,以便我接受并给予您信任吗?

标签: python django dynamic


【解决方案1】:

您重写get_list_display 方法的想法听起来不错。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2016-11-11
    • 2012-05-21
    • 2012-03-13
    相关资源
    最近更新 更多