Django admin:如何在单个管理视图中编辑具有间接关系的两个模型?

时间:2014-10-14 16:16:53

标签: django

我正在构建一个网站,它将提供不同语言的用户提供的内容,并且会有不同的实体,如文章,问题/答案,电子邮件模板等。以下数据库模式对我来说是合乎逻辑的(伪代码)描述我的数据库):

Item
    id (primary key)

Translation
    item_id (foreign key to Item)
    lang (language code)
    title (string)
    body (string)

Article
    published (datetime)
    visible (boolean)
    item_id (foreign key to Item)

FaqCategory
    item_id (foreign key to Item)

FaqItem
    category_id (foreign key to FaqCategory)
    item_id (foreign key to Item)

... (and so on)

所以一般的想法很简单:

  1. 所有翻译都以统一的方式存储。
  2. 单个项目的翻译指的是同一个项目。
  3. 需要翻译的每个实体都是指一个项目。
  4. 现在我想创建一个管理视图,该视图将显示该项目及其所有翻译。不幸的是,我不能使用Inlines,因为它们只能处理对象之间的直接关系。

    所以我需要自己做一些像Inlines这样的东西 - 本质上允许在同一个视图上编辑不同的模型。是否可以使用标准的管理模板和类(当然需要一些子类化)?我找到了how to override the admin templates,当然很容易扩展更改表单模板并在那里插入任何内容,但我不知道如何为我的扩展提供数据。似乎管理类中没有上下文...我是否必须从头开始制作整个视图?

1 个答案:

答案 0 :(得分:2)

您可以使用generic foreign keys代替使用Item模型,以便您的模型成为:

Translation
    item (generic foreign key to Article, FaqCategory or FaqItem)
    lang (language code)
    title (string)
    body (string)

Article
    published (datetime)
    visible (boolean)
    item_id (foreign key to Item)

FaqCategory
    item_id (foreign key to Item)

FaqItem
    category_id (foreign key to FaqCategory)
    item_id (foreign key to Item)

然后,您可以使用inline model admins