создать дерево данных (включая node.id), используя django_treebeard - PullRequest
1 голос
/ 18 марта 2012

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

В dump_bulk () есть вся необходимая информация, но я, как новичок в python и django, пытаюсь найти способ извлечь информацию и отобразить ее в шаблоне.

Я думал о переключении на javascript и разборе строки json, но javascript не нравится префикс u перед значениями строки. Есть ли простой способ избежать префикса u?

Я также думал о написании функции, основанной на get_annotated_list (), которая содержит информацию об идентификаторе. Я предполагаю, что должна быть возможность перегрузить список get_annotated_, чтобы информация об идентификаторе была включена, но я не слишком уверен, как справиться с этим.

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

1 Ответ

0 голосов
/ 26 марта 2014

Как вы, вероятно, знаете, get_annotated_list() вернет массив кортежей в форме (node, info). info - это просто словарь, поэтому вы можете перебирать список и добавлять любые дополнительные пары ключей, которые вам нравятся. Например.,

for node, info in my_annotated_list:
    info['foo'] = node.id

Передайте это вашему шаблону, и все будет в порядке.

Вы также можете использовать генератор. Это из проекта, над которым я сейчас работаю:

def annotated_menu_items(initial_header, menu_items):
    headings = [initial_header]
    for item, info in menu_items:

        yield item, info, item.is_leaf(), headings[-1:][0]

        if info['open']:
            headings.append(item.title)

        for close in info['close']:
            headings.pop()

Здесь я добавляю в качестве дополнительной информации, является ли рассматриваемый узел листом, и помещаю заголовок с самого последнего открытого узла в стек, чтобы я мог получить к нему доступ с более глубоких уровней дерева.

Вы говорите, что вы новичок в Python, поэтому вы можете прочитать о генераторах. Они материализуют элементы (потенциально бесконечного) списка лениво. Чтобы использовать его, вы вызываете функцию, которая создает генератор, затем вы можете рассматривать объект генератора как iterable. Например.,

my_fancy_menus = annotated_menu_items("My Menu", my_annotated_list)

for menu in my_fancy_menus:
    do_stuff(menu)

Вы также можете передавать генераторы в шаблоны Django, где они обрабатываются как списки.

...