python - 在mako模板中迭代嵌套的dict

标签 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", "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

以上代码片段引发错误(“str”对象没有属性“iteritems”)。

迭代嵌套字典的正确方法是什么?

谢谢

最佳答案

很难做到这一点。最近,我试图做一些非常相似,发现这个帖子,很伤心地看到,它没有任何答案。

您要求使用“适当”的方式,我认为对项目进行迭代将是最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)

如果您知道只有一个嵌套级别,则可以执行以下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)

(在Python3和2中测试)

尽管现在我已经对此进行了更多介绍,但是您的代码在Python 2.7.15和mako版本1.0.7中对我来说工作正常。 。 。

关于python - 在mako模板中迭代嵌套的dict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39125927/

相关文章:

python - 用 mako 创建一个表

python - Jinja2模板编译信息

python - 如何在 Python 中使用 selenium 滚动到页面末尾?

python - 使用 python 请求登录 Facebook

python - 嵌套多个条件的 if 语句

Python:如何获取方括号内的多个元素

python - 在python中查找两个列表之间的微分条件

python - 是我的人工编译器 : What is wrong with this Python 2. 5 代码吗?

python - 如何从 Python 中的 csv 列中减去/添加时间?

Mako 模板中的 JavaScript 模板文字