Ich habe eine HTML / jinja2-Vorlage, mit der ich Daten in Form einer Tabelle anzeige.
Die Daten für die Tabelle können auf unterschiedliche Weise vorliegen, und ich möchte, dass die Vorlage beide Typen mit if-Anweisungen verarbeiten kann. Die Funktion type (x) in Python funktioniert in dieser Sprache nicht.
eine Reihe von Wörterbüchern (Liste der Wörterbücher)
ein Array von Arrays (Liste von Listen)
Ein Teil der Vorlage:
{% block page_content %}
<input type="text" id="search" placeholder="Type to search">
<table id="table" class="table">
<tr style="white-space:nowrap;">
{% for h in headers %}
{% if h is string %}
<th>{{h}}</th>
{% else %}
<th>{{h[1]}}</th>
{% endif %}
{% endfor %}
</tr>
{%if data is "TYPE CHECK HERE"}
{% for row in data %}
{% if row != {} %} #ALTERNATIVELY, COULD DO A TYPE CHECK HERE
<tr style="white-space:nowrap;{% if row['bad'] %}background-color:rgba(255, 0, 0, 0.09);{% endif %}">
{% for h in headers %}
<td style="white-space:nowrap;">{{ row[h[0]] }}</td>
{% endfor %}
</tr>
{% endif %}
{% endfor %}
{% endblock%}
TL: DR Was sind die unterscheidbaren Typen in jinja2? Wie überprüfe ich den Typ einer Variablen?
3 Antworten
Es ist besser, so viel wie Ihren Logikcode auf der Python-Seite zu belassen, bevor Sie Jinja rendern.
Übertragen Sie also Ihre Daten auf der Python-Seite in eine Liste von Headern und eine verschachtelte Liste als Ihre Daten:
render_template('test.html',
headers=['name', 'age',],
rows=[{'color': 'red', 'data': ['john', 84]},
{'color': 'green', 'data':['jacob', 45]}]
Html:
<table>
<thead>
<tr>
{% for item in header %}
<th> {{ item }} </th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for row in rows %}
<tr style="colour: {{ row['color'] }}">
{% for cell in row['data'] %}
<td>{{cell}}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
Ich habe beim Lernen auch ähnliche Ansätze wie Sie ausprobiert, aber am Ende habe ich festgestellt, dass dies am besten funktioniert, da Sie dadurch die größtmögliche Flexibilität in Bezug auf Ihre Daten erhalten und die Bearbeitung von Daten auf der Python-Seite oft recht einfach ist. Also keine wirkliche Antwort, nur allgemeine Ratschläge.
Sie könnten diesen Link suchen, dort einige beschreiben gültige Typen zum Vergleichen. Sie können beispielsweise überprüfen, ob es sich um ein Diktat handelt. Sie versuchen:
{% if type({'a':1,'b':2}) is mapping %}
print "Oh Yes!!"
{% else %}
print "Oh No!!!"
{% endif %}
Sie können alles verschachteln, was Sie brauchen, aber der richtige Weg ist hier, komplexe Logik auf den Controller zu migrieren.
PD: Dieses Beispiel stammt aus hier. Vielen Dank an @ sean-vieira
- my_var ist eine Liste
my_var = []
my_var.insert(0, 'list')
- my_var ist str
my_var = '111'
- in jinja2 zu unterscheiden
{% if my_var[0] == 'list' %}
list:
{% for i in my_var[1:] %}
{{ i }}
{% endfor %}
{% else%}
str: {{ my_var }}
{% endif %}
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.