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中,您的代码对我来说很好