Деревья в админке 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).
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

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

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

                          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 гже?

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