Django:有条件的 ModelAdmin 取决于对象

Posted

技术标签:

【中文标题】Django:有条件的 ModelAdmin 取决于对象【英文标题】:Django: conditional ModelAdmin depending on object 【发布时间】:2014-06-08 05:53:39 【问题描述】:

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

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,并为 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 中定义一个方法,正确调用 reverse 并将该方法添加为 list_display 中的列。

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

哦,它必须使用管理员。我宁愿使用视图或单独的模型来做到这一点,但遗憾的是它必须这样做。最高统帅部想要一张桌子上的所有东西。

谢谢!

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

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

【问题讨论】:

【参考方案1】:

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

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

但它有效。我可以忍受。

【讨论】:

以上是关于Django:有条件的 ModelAdmin 取决于对象的主要内容,如果未能解决你的问题,请参考以下文章

Django:从 ModelAdmin 中访问模型实例?

Django 条件管理员 list_editable

如何在 Django ModelAdmin 中创建和保存动态字段?

Django ModelAdmin 从 ModelForm 获取查询集

在 django 中测试 admin.ModelAdmin

Django网站管理--ModelAdmin