web-dev-qa-db-fra.com

Le modèle Jinja2 ne rend pas correctement l'instruction if-Elif-else

J'essaie de définir la couleur du texte à l'aide de CSS dans un modèle jinja2. Dans le code suivant, je souhaite que la chaîne de sortie soit imprimée dans une couleur de police spécifique si la variable contient une chaîne. Chaque fois que le modèle est généré bien qu'il s'imprime en rouge en raison de l'instruction else, les deux premières conditions ne sont jamais visualisées, même si la sortie doit correspondre, je peux dire quelle est la sortie de la variable lorsque la table est générée et qu'elle est comme prévu . Je sais que mon css est correct à cause de l'impression de la chaîne en rouge par défaut.

Ma première pensée a été de mettre la chaîne que je cherchais entre guillemets, mais cela n'a pas fonctionné. Ensuite, jinja ne développait pas RepoOutput[RepoName.index(repo)], mais la boucle for ci-dessus fonctionne, RepoName est développé correctement. Je sais que si j'ajoute les accolades, cela affichera la variable dont je suis à peu près sûr qu'il cassera le modèle ou ne fonctionnera tout simplement pas.

J'ai essayé de regarder ces sites et j'ai aussi parcouru la liste des expressions globales, mais je n'ai trouvé aucun exemple similaire au mien ou à une direction dans laquelle aller chercher plus loin.

http://jinja.pocoo.org/docs/templates/#if

http://wsgiarea.pocoo.org/jinja/docs/conditions.html

   {% for repo in RepoName %}
       <tr>
          <td> <a href="http://mongit201.be.monster.com/icinga/{{ repo }}">{{ repo }}</a> </td>
       {% if error in RepoOutput[RepoName.index(repo)] %}
          <td id=error> {{ RepoOutput[RepoName.index(repo)] }} </td> <!-- I want this in green if it is up-to-date, otherwise I want it in red -->
       {% Elif Already in RepoOutput[RepoName.index(repo) %}
          <td id=good> {{ RepoOutput[RepoName.index(repo)] }} </td>   <!-- I want this in green if it is up-to-date, otherwise I want it in red -->
       {% else %}
            <td id=error> {{ RepoOutput[RepoName.index(repo)] }} </td> <!-- I want this in green if it is up-to-date, otherwise I want it in red -->
       </tr>

       {% endif %}
   {% endfor %}

Merci

34
Matty

Vous testez si les valeurs des variables error et Already sont présentes dans RepoOutput[RepoName.index(repo)] . Si ces variables n'existent pas, un objet non défini est utilisé.

Les deux tests if et Elif sont donc faux; il n'y a pas d'objet indéfini dans la valeur de RepoOutput [RepoName.index (repo)].

Je pense que vous vouliez vérifier si certaines chaînes sont dans la valeur:

{% if "error" in RepoOutput[RepoName.index(repo)] %}
    <td id="error"> {{ RepoOutput[RepoName.index(repo)] }} </td>
{% Elif "Already" in RepoOutput[RepoName.index(repo) %}
    <td id="good"> {{ RepoOutput[RepoName.index(repo)] }} </td>
{% else %}
    <td id="error"> {{ RepoOutput[RepoName.index(repo)] }} </td>
{% endif %}
</tr>

Autres corrections que j'ai apportées:

  • Utilisé {% Elif ... %} au lieu de {$ Elif ... %}.
  • déplacé le </tr> tag en dehors de la structure conditionnelle if, il doit être toujours présent.
  • mettre des guillemets autour de l'attribut id

Notez que vous voudrez probablement utiliser un attribut class, pas un id, ce dernier doit avoir une valeur qui doit être unique dans votre document HTML.

Personnellement, je définirais la valeur de classe ici et réduirais un peu la duplication:

{% if "Already" in RepoOutput[RepoName.index(repo)] %}
    {% set row_class = "good" %}
{% else %}
    {% set row_class = "error" %}
{% endif %}
<td class="{{ row_class }}"> {{ RepoOutput[RepoName.index(repo)] }} </td>
61
Martijn Pieters