Wie Erzeuge ein python dict, wie eine html-Tabelle mit vertikalen Spalten
Habe ich ein python dict, wo jede Taste entspricht einer überschrift, und die zugehörige Liste mit jede Rubrik enthält eine beliebige Anzahl von Werten:
data = {
"heading1": ['h1-val1', 'h1-val2', 'h1-val3', ],
"heading2": ['h2-val1', ],
"heading3": ['h3-val1', 'h3-val2', 'h3-val3', 'h3-val4', ],
}
Muss ich machen das in einer Django-Vorlage als Tabelle, wo die Werte aufgeführt sind, vertikal unter jeder überschrift mit fehlenden Werten dargestellt, als eine leere Zelle in der Tabelle:
<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>
Was ist der beste Weg, dies zu erreichen?
Meine erste Neigung ist es, ordnen Sie die ursprünglichen dict in eine 2D-matrix, und nur passieren, dass in der Vorlage. Ich bin sicher, ich bin nicht der erste, der diese Art von problem, obwohl, und ich bin gespannt, wie andere dieses problem gelöst haben.
UPDATE: Nur als Referenz, hier ist meine ursprüngliche Lösung für dieses problem (das ich bin nicht sehr glücklich mit).
# 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
Ich dann an der matrix in der Vorlage, die wie folgt aussah:
<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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn wir die änderung der Spiel ein kleines bisschen, es ist eigentlich ein Kinderspiel, um diese herum (so lange, wie Sie Ihre Listen sind Keine gefüllten...)
Für mich, es ergibt sich die folgende (leere Linien ausgezogen):
dict.items()
Ihnen die Schlüssel zu geben, in einer vorhersagbaren Reihenfolge. Es passiert einfach so, dass die Spaltung überschriften von Daten auch vereinfacht den template-Struktur.Kenneth Reitz schlug vor, man könnte dieses problem auch lösen, mit tablib, so dass ich dachte, ich würde beinhalten, dass auch hier gilt:
Diese sichert alle relevanten Daten in ein Dataset, was könnte man dann machen Sie eine Vorlage mit den folgenden:
Erzeugt html-Code, sieht wie folgt aus:
Versuchen den code unten. Beachten Sie, dass seit Sie mit assoziativen Arrays für Daten, die Reihenfolge, in der die überschriften angezeigt wird, kann nicht garantiert werden.