我正在尝试从树形模型中显示目录树。在treebeard教程中建议的带注释列表方法工作正常,但我想在数据树中包含id信息。
dump_bulk()拥有我需要的所有信息,但作为一个python和django新手,我正在努力寻找一种方法来提取信息并将其显示在模板中。
我已经考虑过切换到javascript,并解析json字符串,但javascript不喜欢字符串值之前的u前缀。是否有一种简单的方法可以避免使用u前缀?
我还考虑过编写一个基于get_annotated_list()的函数,该函数包含id信息。我假设应该可以重载get_annotated_列表,以便包含id信息,但我不太确定如何解决这个问题。
任何和所有建议,以帮助我在学习曲线上取得进展,将不胜感激。
答案 0 :(得分:0)
您可能知道,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模板,它们被视为列表。