首页 > 解决方案 > 使用 python-docx-template (docxtpl) 时遍历列表(或 dict)

问题描述

编辑:我必须承认我搞砸了并且没有下载所有的示例/测试。我下载了整个软件包,并找到了一些很棒的示例,这些示例向我展示了如何做我想做的所有事情。此特定问题显示在dynamic_table_tpl.py和中dynamic_table.docx

我正在使用 python-docx-template 并创建了一个 DOCX 模板。我一直在尝试按照文档建议使用 jinja2 格式。我需要在我的 DOCX 文件中添加一系列地址。该数据来自数据库,我正在使用 python 从数据库中提取它。

这是我在 DOCX 模板文件中的内容:

{% for kid in kids %}
{kid.first}{kid.last}
{kid.addr1}{kid.addr2}
{kid.city}{kid.state}{kid.zip}  

{% endfor %}

这是在我的 .py 文件中:

kids = [
    [
        ('first','John'),
        ('last','Williams'),
        ('addr1','5555 NW 37th St')
        ('addr2','Apt 2601')
        ('city','Oklahoma City')
        ('state','OK')
        ('zip','73112')
    ],
    [
        ('first','George'),
        ('last','Lucas'),
        ('addr1','1234 Dobbs St.')
        ('addr2','Suite 62')
        ('city','Moore')
        ('state','OK')
        ('zip','73160')
    ]
]

context = {
    "kids" : kids
}

我查看了文档和示例,但还没有找到如何进行这项工作。如果我在数据库中有 2 个孩子,我希望结果看起来像这样:

John Williams
5555 NW 37th St., Apt 2601
Oklahoma City, OK 73112

George Lucas
1234 Dobbs St., Suite 62
Moore, OK 73160

该模板没有替换循环中的任何内容。它正在创建的 DOCX 中编写两个循环,在模板中我for kid in kids只编写了一次循环。它以某种方式阅读它,但不完全是我需要它工作的方式。

任何帮助是极大的赞赏!

标签: pythonpython-docx

解决方案


在使用元组(括号的东西)时,不可能到达没有数字索引的元素。因此,最好的办法是通过类似的索引访问它们kid[1],或者在访问之前将元组转换为字典(IMO 这是最可靠的)


推荐阅读