【发布时间】:2011-10-16 14:08:03
【问题描述】:
我有一个 python dict,其中每个键对应一个标题,与每个标题关联的列表包含任意数量的值:
data = {
"heading1": ['h1-val1', 'h1-val2', 'h1-val3', ],
"heading2": ['h2-val1', ],
"heading3": ['h3-val1', 'h3-val2', 'h3-val3', 'h3-val4', ],
}
我需要在 Django 模板中将其呈现为表格,其中的值垂直列在每个标题下方,任何缺失的值都呈现为空表格单元格:
<table>
<thead>
<tr>
<th>heading1</th>
<th>heading2</th>
<th>heading3</th>
</tr>
</thead>
<tbody>
<tr>
<td>h1-val1</td>
<td>h2-val1</td>
<td>h3-val1</td>
</tr>
<tr>
<td>h1-val2</td>
<td></td>
<td>h3-val2</td>
</tr>
<tr>
<td>h1-val3</td>
<td></td>
<td>h3-val3</td>
</tr>
<tr>
<td></td>
<td></td>
<td>h3-val4</td>
</tr>
</tbody>
</table>
实现这一目标的最佳方法是什么?
我的第一个倾向是将原始 dict 重新排列为 2D 矩阵,然后将其传递到模板中。不过,我确定我不是第一个遇到这种问题的人,我很好奇其他人是如何解决这个问题的。
更新:仅供参考,这是我对这个问题的原始解决方案(我对此不太满意)。
# Using the data dict from the question:
size = max(len(data['heading1']), len(data['heading2']), len(data['heading3']))
matrix = [[None, None, None] for i in range(size)] # initialize an empty matrix
# manually copy the data into the appropriate column :(
i = 0
for item in data['heading1']:
matrix[i][0] = item
i += 1
i = 0
for item in data['heading2']:
matrix[i][1] = item
i += 1
i = 0
for item in data['heading3']:
matrix[i][2] = item
i += 1
然后我将矩阵传递到如下所示的模板中:
<table>
<thead><tr>
<th>heading1</th>
<th>heading2</th>
<th>heading3</th>
</tr></thead>
<tbody>
{% for row in matrix %}
<tr>
{% for col in row %}
<td>{% if col %}{{ col }}{% else %} {% endif %}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
【问题讨论】: