使用django_treebeard创建数据树(包括node.id)

时间:2012-03-18 00:03:14

标签: django tree django-treebeard

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

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

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

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

任何和所有建议,以帮助我在学习曲线上取得进展,将不胜感激。

1 个答案:

答案 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模板,它们被视为列表。