Как отрендерить python dict в виде таблицы html с вертикальными столбцами

У меня есть 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 %}&nbsp;{% endif %}</td>
    {% endfor %}
    </tr>
{% endfor %}
</tbody>
</table>
7
задан Brad Montgomery 30 July 2011 в 21:17
поделиться