0

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

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

4

1 回答 1

0

Django-Polymorphic 绝对是要走的路。它易于使用,并在我单击基础对象时自动为我提供正确的 modelAdmin,这是我无法使用 Proxies 复制的。

唯一的问题是为每个子类创建一个表,即使子类没有任何附加字段,并且即使没有从中恢复任何内容,也会对每个子类执行额外的查询(表中只有列是外来的基础对象的密钥)。

但它有效。我可以忍受这一点。

于 2014-05-05T08:02:55.163 回答