web-dev-qa-db-ja.com

jinjaテンプレートで辞書のリストを反復処理する方法は?

私は試した:

list1 = [{"username": "abhi", "pass": 2087}]
return render_template("file_output.html", list1=list1)

テンプレートで:

<table border=2>
  <tr>
    <td>
      Key
    </td>
    <td>
      Value
    </td>
  </tr>
  {% for dictionary in list1 %}
    {% for key in dictionary %}
      <tr>
        <td>
          <h3>{{ key }}</h3>
        </td>
        <td>
          <h3>{{ dictionary[key] }}</h3>
        </td>
      </tr>
    {% endfor %}
  {% endfor %}
</table>

上記のコードは、各要素を複数の文字に分割しています:

[

{

"

u

s

e

r

...

上記のネストされたループを単純なPythonスクリプトでテストしましたが、正常に機能しますが、Jinjaテンプレートでは機能しません。

47
user3089927

データ:

parent_dict = [{'A':'val1','B':'val2'},{'C':'val3','D':'val4'}]

jinja2イテレーション:

{% for dict_item in parent_dict %}
   {% for key, value in dict_item.items() %}
      <h1>Key: {{key}}</h1>
      <h2>Value: {{value}}</h2>
   {% endfor %}
{% endfor %}

注意:

dict項目のリストがあることを確認してください。UnicodeErrorを取得した場合、dict内の値はUnicode形式を含んでいる可能性があります。その問題は、views.pyで解決できます。dictがunicodeオブジェクトの場合、utf-8にエンコードする必要があります

109
Nava

@Navaneethanの答えの補足として、Jinja2は、辞書のキーまたはリスト内のアイテムの場所がわかっている場合、リストとディクショナリに対して「通常の」アイテム選択を行うことができます。

データ:

parent_dict = [{'A':'val1','B':'val2', 'content': [["1.1", "2.2"]]},{'A':'val3','B':'val4', 'content': [["3.3", "4.4"]]}]

jinja2イテレーション:

{% for dict_item in parent_dict %}
   This example has {{dict_item['A']}} and {{dict_item['B']}}:
       with the content --
       {% for item in dict_item['content'] %}{{item[0]}} and {{item[1]}}{% endfor %}.
{% endfor %}

レンダリングされた出力:

This example has val1 and val2:
    with the content --
    1.1 and 2.2.

This example has val3 and val4:
   with the content --
   3.3 and 4.4.
15
Chris.Q
{% for i in yourlist %}
  {% for k,v in i.items() %}
    {# do what you want here #}
  {% endfor %}
{% endfor %}
8
corvid