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.

  1. un tableau de dictionnaires (liste des dictionnaires)

  2. 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?

1
Josh Sharkey 17 avril 2018 à 23:51

3 réponses

Meilleure réponse

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.

2
Joost 17 avril 2018 à 21:42

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

0
Juan Castaño 17 avril 2018 à 21:57
  1. my_var est la liste
my_var = []
my_var.insert(0, 'list')
  1. my_var est str
my_var = '111'
  1. distinguer dans jinja2
{% if my_var[0] == 'list' %}
list: 
{% for i in my_var[1:] %}
{{ i }}
{% endfor %}

{% else%}
str: {{ my_var }}
{% endif %}
0
admin 5 sept. 2019 à 01:47