假设我有一个基类,例如:
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
答案 0 :(得分:0)
Django-Polymorphic绝对似乎还有很长的路要走。它易于使用,当我点击一个基础对象时,会自动给我正确的modelAdmin,这是我无法用Proxies复制的。
唯一的问题是为每个子类创建了一个表,即使子类没有任何其他字段,并且每个子类执行额外的查询,即使没有从中恢复任何内容(只有列中的该表是基础对象的外键。)
但它有效。我可以忍受。