Шаблон Jinja2 не выполняет корректную инструкцию if-elif-else

Я пытаюсь установить цвет текста с помощью css в шаблоне jinja2. В следующем коде я хочу установить выходную строку для печати в определенном цвете шрифта, если переменная содержит строку. Каждый раз, когда шаблон генерируется, хотя он печатает красным цветом из-за инструкции else, он никогда не видит первые два условия, даже если вывод должен быть сопоставлен, я могу сказать, какой результат из переменной возникает, когда таблица генерируется, и она как и ожидалось, Я знаю, что мой css корректен из-за печати строки по красному по умолчанию.

Моя первая мысль заключалась в том, чтобы заключить строку, которую я проверял в кавычках, но это не сработало. Далее было то, что jinja не расширялся RepoOutput[RepoName.index(repo)], но цикл for выше этого работает, RepoName расширяется правильно. Я знаю, что если я добавлю фигурные скобки, он напечатает переменную, которая, я уверен, либо сломает шаблон, либо просто не сработает.

Я попытался взглянуть на эти сайты и также просмотрел список глобальных выражений, но не смог найти никаких примеров, похожих на мои или направления, в которых нужно смотреть дальше.

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

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

   {% for repo in RepoName %}
       <tr>
          <td> <a href="#" onclick="location.href='http://mongit201.be.monster.com/icinga/{{ repo }}'; return false;">{{ 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 %}

Спасибо

Ответы

Ответ 1

Вы проверяете, имеются ли значения переменных error и Already в RepoOutput[RepoName.index(repo)]. Если эти переменные не существуют, то используется undefined object.

Оба ваших теста if и elif поэтому являются ложными; не существует объекта undefined в значении RepoOutput [RepoName.index(repo)].

Я думаю, вам нужно было проверить, есть ли в строке значения следующие значения:

{% 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>

Другие исправления, которые я сделал:

  • Используется {% elif ... %} вместо {$ elif ... %}.
  • переместил тег </tr> из условной структуры if, он должен быть всегда.
  • помещает кавычки вокруг атрибута id

Обратите внимание, что скорее всего вы хотите использовать здесь атрибут class, а не id, последний должен иметь значение, которое должно быть уникальным в вашем документе HTML.

Лично я бы установил значение класса здесь и немного уменьшил дублирование:

{% 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>