我可以让 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 管理员反映模型的层次结构吗?的主要内容,如果未能解决你的问题,请参考以下文章