2012-03-13 2 views
4

Я полностью потерянный новичок, пытающийся выяснить, как сделать динамически сгенерированный жестко закодированный список ссылок, а не только как упражнение noob при изучении Django, но также и данные можно редактировать с помощью admin. Важно то, что он выглядит точно таким же, когда генерируется через db, как сейчас, в жестко закодированном состоянии.Моделирование Django tree

Основное содержание здесь должна быть представлена ​​моделями:

http://www.drugpolicyreformmovement.com/directory

Я думаю, что я бы первым сделать «Категория» таблицу категории заголовков, а затем сделать «ссылку» таблицы ссылок с отношением ForeignKey к категории. Я думаю, что в шаблоне я бы использовал тег шаблона «ifchanged» совместно с (вложенными?) Для циклов, чтобы поочередно перебирать каждый заголовок, отображая дочерние записи каждого заголовка.

В том случае, когда это осложняется, под заголовком «Исследование &», в котором дочерняя запись имеет свою собственную дочернюю запись. Потенциально, особенно. когда я повторно использую этот код для других проектов, мне нужно будет разместить произвольное количество дочерних уровней.

Я провел два дня, просматривая документы и ответы здесь, и у меня все еще нет достаточно ясного представления о том, как это будет выглядеть в моделях, представлениях или шаблонах.

Например, как вы проходите «вниз» дочерние уровни в шаблоне, чтобы узнать, есть ли у этого элемента дочерние элементы? Как вы делаете все это, не ударяя db тысячу раз за просмотр?

ответ

6

Что вы делаете: использовать django-mptt.

Это в значительной степени каноническое решение для хранения дерева узлов в базе данных и эффективного его извлечения с минимальным доступом к базе данных. Он включает в себя некоторые полезные теги шаблонов, которые должны помочь вам выводить все, что вам нужно.

1

Я бы очень обескуражил использование django-mptt по нескольким причинам.

  1. Вы можете очень легко повредить свои данные, просто используя исходные вставки.
  2. Вставка/перемещение/удаление одного элемента приводит к обновлению всего дерева. Это может быть медленным на больших деревьях.

Гораздо лучше использовать родное поле Postgres ltree. Однако есть некоторые недостатки. Это Postres только и там. Нет родных библиотек django, и вы должны сами создавать расширение Postgres. В противном случае вы получите сообщение об ошибке type "ltree" does not exist. Там же и легко исправить: CREATE EXTENSION ltree;

Это django-tree репо, кажется, работает, но официально не поддерживает Django 2,0

Смежные вопросы