1

我正在尝试从树须模型中显示目录树。treebeard 教程中建议的带注释的列表方法工作正常,但我想在数据树中包含 id 信息。

dump_bulk() 包含我需要的所有信息,但作为 python 和 django 新手,我正在努力寻找一种方法来提取信息并将其显示在模板中。

我考虑过切换到 javascript,并解析 json 字符串,但 javascript 不喜欢字符串值之前的 u 前缀。有没有一种简单的方法可以避免 u 前缀?

我还考虑过基于 get_annotated_list() 编写一个包含 id 信息的函数。我假设应该可以重载 get_annotated_ 列表以便包含 id 信息,但我也不太确定如何解决这个问题。

任何和所有帮助我沿着学习曲线进步的建议都将不胜感激。

4

1 回答 1

1

您可能知道,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 模板,在那里它们被视为列表。

于 2014-03-25T20:50:28.623 回答