J'ai un modèle HTML / jinja2 que j'utilise pour afficher des données sous forme de tableau.
Les données de la table peuvent provenir de différentes manières, et je souhaite que le modèle puisse gérer les deux types à l'aide d'instructions if. la fonction type (x) en python ne fonctionne pas dans ce langage.
un tableau de dictionnaires (liste des dictionnaires)
un tableau de tableaux (liste de listes)
Une partie du modèle:
{% 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 Quels sont les types distinguables dans jinja2? Comment vérifier le type d'une variable?
3 réponses
Il est préférable de conserver autant que votre code logique du côté python, avant de rendre jinja.
Transférez donc vos données côté python vers une liste d'en-têtes et une liste imbriquée en tant que données:
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>
J'ai également essayé des approches similaires à la vôtre tout en apprenant, mais j'ai finalement trouvé que cela fonctionnait mieux car cela vous donne le plus de flexibilité sur vos données, et la manipulation des données du côté python est souvent assez simple. Donc pas vraiment une réponse, juste un conseil général.
Vous pouvez consulter ce lien, y décrire certains types valides à comparer. Par exemple, vous pouvez vérifier que c'est un dict, vous essayez:
{% if type({'a':1,'b':2}) is mapping %}
print "Oh Yes!!"
{% else %}
print "Oh No!!!"
{% endif %}
Vous pouvez imbriquer tout ce dont vous avez besoin, mais la bonne façon est de migrer la logique complexe vers le contrôleur.
PD: Cet exemple est tiré de ici. Merci à @ sean-vieira
- my_var est la liste
my_var = []
my_var.insert(0, 'list')
- my_var est str
my_var = '111'
- distinguer dans jinja2
{% if my_var[0] == 'list' %}
list:
{% for i in my_var[1:] %}
{{ i }}
{% endfor %}
{% else%}
str: {{ my_var }}
{% endif %}
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.