【问题标题】:create data tree (including node.id) using django_treebeard使用 django_treebeard 创建数据树(包括 node.id)
【发布时间】:2012-04-03 00:51:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: django tree django-treebeard


    【解决方案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 模板,在那里它们被视为列表。

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多