假设我有一个基类,例如:
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)
现在,我将几种类型的对象输入到表中,其中一些使用部分数据,一些使用其他部分,所有这些都使用一些公共部分(本例中的名称)。
我想要一个完整的列表,但是当我点击一个对象时,我希望有不同的视图,这取决于它的类型。modelAdmin 的变化包括:其中一个类使用内联,其他类不使用,list_display 变化,一个有额外的 CSS,等等。基本上我们在谈论不同的 modelAdmins。
我在想的替代方案:一个是这些类型中的每一个都是Base的子类,即:
class Type1(Base):
pass
class Type2(Base):
pass
然后我为它们中的每一个定义了一个modelAdmin,并为基类定义了一个,只是为了让表格列出所有内容。在这一个中,我将覆盖链接,因此它们不会转到 /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 , ETC。
第一个替代方案对我来说看起来更干净,尽管我不确定如何修改链接,除了在 modelAdmin 中定义一个方法并正确调用 reverse 并将该方法添加为 list_display 中的列。
有没有更简单的方法我错过了?你会怎么做?
哦,它必须使用管理员。我宁愿使用视图或单独的模型来做到这一点,但遗憾的是它必须这样做。最高指挥部想要一张桌子上的所有东西。
谢谢!。
编辑:另外,我刚刚发现了这个,看起来不错:
http://django-polymorphic.readthedocs.org/en/latest/admin.html