Как вы, вероятно, знаете, 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, где они обрабатываются как списки.