Деревья в админке django

Редактировать модели, представляющие собой деревья в админке django очень неудобно и ненаглядно. Сразу возникло желание выводить вместо списка объектов дерево, для этого можно использовать замечательную библиотеку jstree.
Чтобы эффективно работать с деревьями в django существует mptt, которая добавляет в модель поля для эффективной выборки и методы для этого, а также шаблонные теги для вывода деревьев и т.п.
Если вы не используете mptt, у вас есть просто ссылка на parent — jstree можно подключить к с помощью одного javascript, про это — отдельная статья.
Далее про модели, использующие mptt.

Я написал базовый класс для админок моделей, использующих mptt. Он заменяет view списка объектов на свой, который выводит дерево, добавляет ajax-запросы для перемещения ветвей в новое место, переименовывания объектов и их удаления.
Соответственно, ветви можно перетаскивать в нужное место, переименовывать, и удалять. Создание ветвей перенаправляет на view создания объекта, выставляя ссылку на родительский элемент.
В ветви дерева могут выводиться значения несколько полей. Если для пользователя недоступны какие-то действия — они будут заблокированы в jstree. Щелчок по ветви перенаправляет на view редактирования, правой кнопкой — вызывает контекстное меню.

screenshot

Чтобы воспользоваться этим, нужно установить mptt_admin:

hg clone http://code.tabed.org/mptt_admin/
cd mptt_admin
python setup.py install

Вместе с mptt_admin идет пример проекта, можно использовать его для тестирования.

Добавить в соотв. admin.py такой код:

from myapp.models import MyModel
from mpttadmin import MpttAdmin

class MyModelAdmin(MpttAdmin):
    tree_title_field = 'name'
    tree_display = ('name','slug','created|date') #name тут указывать необязательно

    class Meta:
        model = MyModel

Шаблоны зашиты в MpttAdmin, необходимые яваскрипты он умеет отдавать сам.

tree_title_field нужно для переименовывания, если его не указать — переименовывание будет недоступно, а выводиться будет __unicode__ объекта.
По аналогии с list_display можно задать несколько полей, причем в них можно использовать фильтры, благодаря особенностям реализации(кроме tree_title_field).
+22
26 февраля 2010, 13:02
59
pawnhearts 34,5

комментарии (16)

+2
Riz #
Спасибо за заметку,
возможно кому-то будет полезен ещё один вариант для редактирования деревьев — spinlock.ch/pub/feincms/html/admin.html#module-feincms.admin.tree_editor, работает тоже в mptt и подключается 2 строками.
0
joymax #
Отличная работа – действительно просто и гибко
0
kmike #
Еще можно из feincms редактор использовать: ставим feincms и наследуем админку для нужной модели от feincms.admin.editor.TreeEditor (если не путаю), все остальное в feincms можно и не использовать.
0
kmike #
тьфу, написали уже.
0
vostryakov #
Отлично! Скоро мне понадобиться как раз :) Спасибо!
0
bobry #
Рекомендую вместо django-mptt использовать django-treebeard, который умеет по разному хранить деревья в БД, но реализует к ним единый интерфейс.
0
pawnhearts #
я видел treebeard, во-первых, так просто переключиться, когда в базе есть данные, не получится. во-вторых, алгоритм используемый в mptt(nested sets) самый подходящий в большинстве случаев т.к. обычно чтений в веб приложениях намного больше, чем записей. Тем более в деревьях обычно хранят редко обновляемые данные — структуру разделов и т.п.
0
neithere #
О, спасибо, ждал этой заметки :)
0
vostryakov #
Спасибо за статью! Применил в своем проекте :)
0
iwuvjhdva #
$ hg clone code.tabed.org/mptt_admin/
abort: HTTP Error 502: Bad Gateway

:-(
0
pawnhearts #
хмхм. перезапустил там всё-это должен был сделать monit, но его прибила ОС когда кончилась оперативка =/ вообще буду разбираться что там произошло такое
0
iwuvjhdva #
Отлично, спасибо! :-)
0
kaoz #
сделал в админке деревья и нашел эту статью. эх…
0
piumosso #
Решение не работает! Вываливается исключение TemplateSyntaxError
0
AlienZzzz #
Вы когда делаете дистрибутив хоть проверяйте.

django.template.TemplateSyntaxError: 'mptt_tags' is not a valid tag library: ImportError raised loading sites.job.templatetags.mptt_tags: No module named mptt.utils

mptt.utils гже?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.