Django:条件ModelAdmin取决于对象

时间:2014-04-23 11:59:00

标签: django django-admin django-modeladmin

假设我有一个基类,例如:

class Base(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    value1 = models.CharField(max_length=50)
    value2 = models.CharField(max_length=50)

现在,我在表中输入了几种类型的对象,其中一些使用了数据的一部分,其中一些使用了其他部分,所有这些都使用了一些公共部分(本例中为name)。

我想要一个完整的列表,但是当我点击一个对象时,我希望有不同的视图,具体取决于它的类型。 modelAdmin中的更改包括:其中一个类使用内联,其他类不使用,list_display各不相同,一个有额外的CSS等等。基本上我们讨论的是不同的modelAdmins。

替代方案我在想:一个是这些类型中的每一个都是Base的子类,即:

class Type1(Base):
    pass

class Type2(Base):
    pass

然后我为每个人定义了一个modelAdmin,为Base类定义了一个,只是为了获得列出所有内容的表。在这一个中,我会覆盖链接,因此它们不会转到/ app / base / id,而是转到/ app / type1 / id,/ app / type2 / id等,具体取决于类型。对于其中的每一个,我修改了modelAdmins,因此在保存之后它们会返回到/ app / type

另一种选择是使用单个模型和单个modelAdmin,并覆盖我用于change_view的每个方法,以考虑它呈现的对象类型,即get_inline_instances,get_formsets,无论我需要修改list_display, list_display_links,list_filter等。

第一个替代方案对我来说看起来更干净,虽然我不知道如何修改链接,除了在modelAdmin中定义一个方法,并使用正确的反向调用并将该方法添加为list_display中的列。

我错过了一种更简单的方法吗?你会怎么做?。

哦,它有使用管理员。我宁愿使用视图或单独的模型来做这件事,但遗憾的是这就是它必须的方式。高级指挥部想把所有东西放在一张桌子里。

谢谢!

编辑:另外,我刚发现这个并且看起来不错:

http://django-polymorphic.readthedocs.org/en/latest/admin.html

1 个答案:

答案 0 :(得分:0)

Django-Polymorphic绝对似乎还有很长的路要走。它易于使用,当我点击一个基础对象时,会自动给我正确的modelAdmin,这是我无法用Proxies复制的。

唯一的问题是为每个子类创建了一个表,即使子类没有任何其他字段,并且每个子类执行额外的查询,即使没有从中恢复任何内容(只有列中的该表是基础对象的外键。)

但它有效。我可以忍受。