Pull to refresh

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

Reading time 2 min
Views 12K
Редактировать модели, представляющие собой деревья в админке 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).
Tags:
Hubs:
+22
Comments 16
Comments Comments 16

Articles