2012-03-13 53 views
4

我是一个完全失去新手试图找出如何使我的硬编码的动态生成的,不仅是作为一个小白锻炼学习Django的,而且这样的数据可以通过管理员进行编辑链接列表。 重要的是,它通过db生成时看起来与现在在硬编码状态下完全相同。Django的树造型

这里的主要内容需要通过模型来表示:

http://www.drugpolicyreformmovement.com/directory

我认为我会先类标题的“类别”表,然后做一个链接“链接”表与ForeignKey关系返回到类别。我认为在模板中,我会使用'ifchanged'模板标记与(嵌套?)for循环一起循环遍历每个标题,以显示每个标题的子记录。

如果这变得复杂的是“研究&教育”的标题,其中一个子记录都有自己的子记录下。可能,尤其是。当我将这些代码重用于其他项目时,我需要适应任意数量的子级别。

我已经花了两天时间通过文档和答案看这里,我还没有什么,这将看起来像模型,视图或模板的足够清晰的画面。

例如,你如何遍历“下”子级别的模板,看看是否一个元素有孩子吗?你怎么做所有这些没有击中数据库每个视图一千次?

回答

6

你要做的就是:用django-mptt

这几乎是将数据库中的节点树存储起来并用最少的db访问高效地检索它的规范解决方案。它包含一些有用的模板标签,可以帮助您输出您想要的东西。

1

我会极力劝阻使用Django的MPTT为两个原因。

  1. 只需使用原始插入,就可以非常容易地破坏数据。
  2. 插入/移动/删除一个项目会导致整个树的更新。大树可能会变慢。

使用本机Postgres字段ltree要好得多。虽然有一些缺点。它只是Postres而已。没有django本地图书馆维护,你必须自己创建Postgres扩展。否则,您将收到错误type "ltree" does not exist。有和简单的解决办法:CREATE EXTENSION ltree;

django-tree回购似乎工作,但它正式不支持的Django 2.0