首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态创建Django ModelAdmin类

动态创建Django ModelAdmin类
EN

Stack Overflow用户
提问于 2013-09-21 15:53:02
回答 1查看 305关注 0票数 1

我有3种不同类型的模型(我有3种抽象的基本模型,比方说面包、鸡蛋和啤酒)和许多继承这三种模型中的一种的模型。

我想以抽象基类为基础,以不同的方式向admin注册具体模型,而不必为每个抽象基类编写单独的ModelAdmin类(即我只想编写3个ModelAdmin类--每个抽象基类一个)。每种类型的具体模型都有一组我希望显示的字段(它们在不同的具体模型上不同,但以一种定义良好的方式,而且我可以很容易地获得我想要显示在Egg模型上的字段的列表)。示例:

代码语言:javascript
复制
#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 (而不必为每个管理类编写单独的模型管理类),并且我希望将list_display设置为get_only_concrete_fields()的结果,再加上来自Egg的几个手工选择的字段(不是全部)。我知道它们是一个get_list_display() (参见https://stackoverflow.com/a/16115125/710394),但是我认为它没有得到模型,所以我不能调用get_only_concrete_fields()。

我还尝试过循环如下所示的模型,为每个模型定义list_display,并使用“基本”ModelAdmin注册每个模型,但这不起作用,因为它只是在循环的每个迭代中重新分配模型管理。

代码语言:javascript
复制
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)

我被困住了-我怎么才能这样干呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-21 22:01:15

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18934594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档