Recursion mako模板递归:AttributeError:';未定义';对象没有属性';id';

Recursion mako模板递归:AttributeError:';未定义';对象没有属性';id';,recursion,undefined,mako,python-3.2,Recursion,Undefined,Mako,Python 3.2,我制作了一个表示树结构的模板。树的每个节点都有一个id、一个名称、一系列子节点(树\子节点)和一个扩展属性 我在树结构中安排了几个节点,然后使用根节点调用以下函数: def print_tree_info(oCat, iOffset=0): """ just for testing purposes. print to console """ sOffset = ' '*iOffset if oCat.expanded: sButton

我制作了一个表示树结构的模板。树的每个节点都有一个id、一个名称、一系列子节点(树\子节点)和一个扩展属性

我在树结构中安排了几个节点,然后使用根节点调用以下函数:

def print_tree_info(oCat, iOffset=0):
    """
    just for testing purposes. print to console
    """
    sOffset = '   '*iOffset
    if oCat.expanded:
        sButton = '-'
    else:
        if oCat.tree_children:
            sButton = '+'
        else:
            sButton = '.'
    print("{0}{1}{2}".format(sOffset,sButton,oCat.name))
    if oCat.expanded:
        for oChild in oCat.tree_children:
            print_tree_info(oChild,iOffset+1)  
它是印刷的

-ROOT_NODE
   +major1
   .base2
这很好

现在,将相同的节点结构传递到mako模板的渲染函数中(以及mako模板本身),我得到了属性错误

以下是我如何呈现模板:

template = Template(..........)
html = template.render(category=root_node, item_template=template)
这是模板

%if category is UNDEFINED:
ERROR
%elif category:
<div class="tree_item"  category_id="${category.id}">
%if category.expanded:
    <a class="collapse_tree_item"  category_id="${category.id}">-</a>
%elif category.tree_children:
    <a class="expand_tree_item" category_id="${oCategory.id}">+</a>
%endif
<a class="select_tree_item">${category.name}</a>
%if category.expanded:
    %for oChild in category.tree_children:
          ${item_template.render(category=oChild,item_template=item_template)}
    %endfor
%endif
</div>
%endif
%如果类别未定义:
错误
%elif类别:
%如果已扩展类别:
-
%elif category.tree_子项:
+
%恩迪夫
${category.name}
%如果已扩展类别:
%对于category.tree_子类中的oChild:
${item_template.render(category=oChild,item_template=item_template)}
%结束
%恩迪夫
%恩迪夫
+
应该是

<a class="expand_tree_item" category_id="${category.id}">+</a>
+
经验教训:保持命名惯例的一致性。

+
应该是

<a class="expand_tree_item" category_id="${category.id}">+</a>
+
经验教训:保持命名惯例的一致性