Python 在mako模板中迭代嵌套dict

Python 在mako模板中迭代嵌套dict,python,python-2.7,mako,Python,Python 2.7,Mako,我对下面的格言有一个看法: {"name1":{"text":"my text 1", "status":"my status"}, "name2":{"text":"my text 2", "status":"my status"}} 使用Mako模板,我想创建一个html表。我尝试了以下方法: Python代码段: test = {"name1":{"text":"my text 1", "status":"my status"}, "name2":{"text":"my text 2",

我对下面的格言有一个看法:

{"name1":{"text":"my text 1", "status":"my status"}, "name2":{"text":"my text 2", "status":"my status"}}
使用Mako模板,我想创建一个html表。我尝试了以下方法:

Python代码段:

test = {"name1":{"text":"my text 1", "status":"my status"}, "name2":{"text":"my text 2", "status":"my status"}}
mytemplate = Template(filename='template/index.mako')
return mytemplate.render(data=test)
Mako片段:

% for key, val in data.iteritems():
    <tr>
        <td>${loop.index + 1}</td>
        <td>${key}</td>
        % for tkey, tval in val.iteritems():
            <td>${tkey}</td>
            <td>${tval}</td>
        % endfor
    </tr>
% endfor
数据中的键val的
%iteritems():
${loop.index+1}
${key}
%对于tkey,值iteritems()中的tval:
${tkey}
${tval}
%结束
%结束
上述代码段引发错误('str'对象没有属性'iteritems')

迭代嵌套dict的正确方法是什么


谢谢你

要做到这一点很难。我最近试图做一些非常类似的事情,发现了这篇文章,很难过地看到它没有任何答案

您要求使用“适当”的方式,我认为迭代这些项目将是最具python风格的方式;但我也无法让它发挥作用。我能够让递归解析器工作(额外的好处是,这将处理n级嵌套)

我让这个工作:

from mako.template import Template

template = '''
${handleLevel(pages)}
<%def name="handleLevel(level, depth=0)">
    % if isinstance(level, dict):
            % for item in level:
                % if isinstance(level[item], dict):
                    <!-- print this item for this level -->
                        ${handleLevel(level[item], depth+1)}
                    <!-- end this level (close div or anything that should contain next level -->
                % else:
                    <!-- handle bottom level (linke, or div, etc.) -->
                    ${item}
                    <!-- close any elements for bottom level not already closed -->
                % endif
            % endfor
    % endif
</%def>
'''

nested = {
    'A': {'B': 'C'},
    'D': 'E',
}
page = Template(template).render(pages=nested)
print(page)
从mako.template导入模板
模板=“”
${handleLevel(页数)}
%如果存在(电平,dict):
%对于级别中的项目:
%如果存在(级别[项目],dict):
${handleLevel(级别[项目],深度+1)}
%其他:
${item}
%恩迪夫
%结束
%恩迪夫
'''
嵌套={
'A':{'B':'C'},
“D”:“E”,
}
页面=模板(模板).呈现(页面=嵌套)
打印(第页)
如果您知道您将只有一个嵌套级别,您可能只需要执行for循环,如:

from __future__ import print_function
from mako.template import Template

template = '''
% for key in data:
    <tr>
        <td>${loop.index + 1}</td>
        <td>${key}</td>
        % for secondKey in data[key]:
            <td>${secondKey}</td>
            <td>${data[key][secondKey]}</td>
        % endfor
    </tr>
% endfor
'''

test = {"name1":{"text":"my text 1", "status":"my status"}, "name2":{"text":"my text 2", "status":"my status"}}
page = Template(template).render(data=test)
print(page)
from\uuuuu future\uuuuu导入打印功能
从mako.template导入模板
模板=“”
%对于输入数据:
${loop.index+1}
${key}
%对于数据中的第二个键[键]:
${secondKey}
${data[key][secondKey]}
%结束
%结束
'''
test={“name1”:{“text”:“我的文本1”,“状态”:“我的状态”},“name2”:{“text”:“我的文本2”,“状态”:“我的状态”}
页面=模板(模板).呈现(数据=测试)
打印(第页)
(在Python3和Python2中测试)

虽然,现在我已经玩了更多关于这个的东西,但是在Python 2.7.15和mako版本1.0.7中,您的代码对我来说很好