我可以让 Django 管理员反映模型的层次结构吗?

Posted

技术标签:

【中文标题】我可以让 Django 管理员反映模型的层次结构吗?【英文标题】:Can I make Django admin reflect a hierarchy of models? 【发布时间】:2013-02-12 03:10:16 【问题描述】:

假设一个 Django 应用程序具有几个通过一对多关系连接的模型:

class Blog(models.Model):
    ...

class Post(models.Model):
    blog = models.ForeignKey(Blog)
    ...

class Comment(models.Model):
    post = models.ForeignKey(Post)
    ...

从概念上讲,它们形成一个层次结构,一个树状结构。我希望 Django 管理员反映这一点。特别是:

    在帖子的更改列表中,每个帖子都应该有一个指向相应 cmets 的更改列表的链接; 同样,帖子的编辑页面应从右上角的按钮区域链接到 cmets 的更改列表; 当我打开相关 cmets 列表时,它需要反映面包屑中的关系(例如:帖子 › “Hello world” › 评论),理想情况下,也反映在 URL (post/123/comment/) 中。李>

这当然也应该适用于层次结构的其他级别。

使用自定义 list_display 条目并使用 ?post__id= 查询 cmets 更改列表非常简单。但这只不过是一种黑客行为。通常 Django 假设我的三个模型是独立的***实体。

有没有一种简单的方法可以做到这一点?我想我可以覆盖一堆模板和AdminModel 方法,但对于看似常见的情况,也许有更好的解决方案?

【问题讨论】:

【参考方案1】:

这是一种常见的情况吗?考虑一个模型可以有几乎无限数量的外键关系这一事实,反之亦然。管理员如何在不进行自定义的情况下“知道”如何以用户需要的方式表示这些数据?

有人会建议您习惯于使用内容管理系统而不是网络框架(没有双关语)。重要的是要注意 Django 不是一个 cms,而是一个您可以根据需要在其上构建的 web 框架。简而言之:“Django 相当无能,也不知道上下文要求”。

尽管管理员是一个开箱即用的野兽,但它可能难以自定义。已经有相当多的讨论是否应该成为核心的一部分。我只能建议,如果自定义东西往往会变得 hacky,你可能应该编写自己的“管理员”,这并不难。

【讨论】:

我所说的“常见”是指“在许多实际用例中观察到的”,而不是“管理员必须透明地处理这个”。配置——比如指定要遍历的外键轴(如果有很多)——可以减少到几行。当然,我并不指望管理员能满足我的每一个突发奇想——但是对于很多这样的突发奇想,有现成的解决方案(通常在核心之外)。但在这里我想答案是“不”。我会再等一段时间再接受。 没有人建议管理员应该自己知道这一点。 Django admin 通过子类化和添加类字段高度可定制。【参考方案2】:

你确定你不只是在看Django Admin Inline Models 吗?

自动化管理员无法获取您的关系,因为在 RDBS 中可以有任意数量的外键/一对一/多对多关系,并且 Django 没有内置的自定义分层行为.

您确实可以根据需要编辑面包屑自定义管理模板。

对于关系,您可能还对django MPTT 感兴趣,它允许创建分层模型实例。另请参阅此问题:Creating efficient database queries for hierarchical models (django) 在这方面。

【讨论】:

@Vasili 抱歉,我在您写评论时写下了我的答案,这绝对适用于这里! @vasiliy-faronov ...如果您需要一些更准确的关于在管理员中触摸什么的建议,请告诉我!

以上是关于我可以让 Django 管理员反映模型的层次结构吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以为此模型使用 Django 的默认管理应用程序吗?

Oracle教程-01

为模型添加了新字段//管理员没有反映这一点

Django 管理员:我可以为模型方法添加过滤器吗?

存储器层次结构

我可以让一些代码像守护进程一样在 Django 中不断运行吗