У меня есть 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>
Как лучше всего этого добиться?
Моя первая склонность - преобразовать исходный текст в двухмерную матрицу и просто передать ее в шаблон. Я уверен, что я не первый, кто столкнулся с подобной проблемой, и мне любопытно, как другие решили эту проблему.
ОБНОВЛЕНИЕ: Для справки, вот мое первоначальное решение этой проблемы. проблема (которой я не очень доволен).
# 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>