Редактировать модели, представляющие собой деревья в админке django очень неудобно и ненаглядно. Сразу возникло желание выводить вместо списка объектов дерево, для этого можно использовать замечательную библиотеку jstree.
Чтобы эффективно работать с деревьями в django существует mptt, которая добавляет в модель поля для эффективной выборки и методы для этого, а также шаблонные теги для вывода деревьев и т.п.
Если вы не используете mptt, у вас есть просто ссылка на parent — jstree можно подключить к с помощью одного javascript, про это — отдельная статья.
Далее про модели, использующие mptt.
Я написал базовый класс для админок моделей, использующих mptt. Он заменяет view списка объектов на свой, который выводит дерево, добавляет ajax-запросы для перемещения ветвей в новое место, переименовывания объектов и их удаления.
Соответственно, ветви можно перетаскивать в нужное место, переименовывать, и удалять. Создание ветвей перенаправляет на view создания объекта, выставляя ссылку на родительский элемент.
В ветви дерева могут выводиться значения несколько полей. Если для пользователя недоступны какие-то действия — они будут заблокированы в jstree. Щелчок по ветви перенаправляет на view редактирования, правой кнопкой — вызывает контекстное меню.
Чтобы воспользоваться этим, нужно установить mptt_admin:
Вместе с mptt_admin идет пример проекта, можно использовать его для тестирования.
Добавить в соотв. admin.py такой код:
Шаблоны зашиты в MpttAdmin, необходимые яваскрипты он умеет отдавать сам.
tree_title_field нужно для переименовывания, если его не указать — переименовывание будет недоступно, а выводиться будет __unicode__ объекта.
По аналогии с list_display можно задать несколько полей, причем в них можно использовать фильтры, благодаря особенностям реализации(кроме tree_title_field).
Чтобы эффективно работать с деревьями в django существует mptt, которая добавляет в модель поля для эффективной выборки и методы для этого, а также шаблонные теги для вывода деревьев и т.п.
Если вы не используете mptt, у вас есть просто ссылка на parent — jstree можно подключить к с помощью одного javascript, про это — отдельная статья.
Далее про модели, использующие mptt.
Я написал базовый класс для админок моделей, использующих mptt. Он заменяет view списка объектов на свой, который выводит дерево, добавляет ajax-запросы для перемещения ветвей в новое место, переименовывания объектов и их удаления.
Соответственно, ветви можно перетаскивать в нужное место, переименовывать, и удалять. Создание ветвей перенаправляет на view создания объекта, выставляя ссылку на родительский элемент.
В ветви дерева могут выводиться значения несколько полей. Если для пользователя недоступны какие-то действия — они будут заблокированы в jstree. Щелчок по ветви перенаправляет на view редактирования, правой кнопкой — вызывает контекстное меню.
Чтобы воспользоваться этим, нужно установить 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).