web-dev-qa-db-ja.com

Jinja2テンプレートがif-Elif-elseステートメントを適切にレンダリングしない

Jinja2テンプレートでcssを使用してテキストの色を設定しようとしています。次のコードでは、変数に文字列が含まれている場合、特定のフォント色で印刷するように出力文字列を設定します。 elseステートメントのために赤で印刷されますが、テンプレートが生成されるたびに、出力を一致させる必要があるにもかかわらず最初の2つの条件が表示されることはありません。 。デフォルトでは赤で文字列が印刷されるため、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="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 %}

ありがとう

34
Matty

variableserrorおよびAlreadyの値がRepoOutput[RepoName.index(repo)]に存在するかどうかをテストしています。これらの変数が存在しない場合は、 未定義オブジェクト が使用されます。

したがって、ifおよびElifテストは両方とも偽です。 RepoOutput [RepoName.index(repo)]の値に未定義のオブジェクトはありません。

代わりに、特定のstringsが値に含まれているかどうかをテストしたいと思います。

{% 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>
61
Martijn Pieters