如何迭代Jinja模板中的词典列表?


78

我试过了:

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模板中却不能。

Answers:


172

数据:

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

在Jinja2迭代中:

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

注意:

确保您有字典项列表。如果UnicodeError可能得到dict中的值包含unicode格式。这个问题可以在你的电脑上解决views.py。如果dict是unicodeobject,则必须编码为utf-8


17
可能是因为我使用的是jinja的较新版本,但就我而言,我必须删除括号(dict_item.items改为使用括号),否则它会引发Could not parse the remainder: '()' from 'dict_item.items()'
TrakJohnson

1
除了TrakJohnson的答案外,我还发现,新的Jinja索引使用dicitonaries,dict.key而不是常规的dict["key"]
卡梅隆·海德

6
@TrakJohnson:那么您不是在使用Jinja模板,而是在使用Django模板。您想了解如何在Django模板的字典中遍历字典吗?。Django模板语法相似,但不相同。
马丁·彼得斯

3
@CameronHyde:Jinja在所有版本中都支持对所有对象的属性和项目访问。请参阅模板文档的“变量”部分。如果dict["key"]对您不起作用,则说明您使用的不是Jinja模板,而是Django模板。请参见通过Django模板中的键访问字典
Martijn Pieters

1
如果您想以不同的方式使用字典中的每个项目,该怎么办-您不想循环浏览键,但仍想访问键?
合法堆栈

20

作为@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.

如果dict的大小不固定并且会随着时间变化,如何修改jinja2代码?
xxxyyyyzzzzz

10
{% for i in yourlist %}
  {% for k,v in i.items() %}
    {# do what you want here #}
  {% endfor %}
{% endfor %}

{lis1.items()中k,v中的%,%} UndefinedError:'unicode object'没有属性'items'
items'– user3089927

1
@ user3089927您的模板还有比向我们展示的更多的内容吗?此解决方案是正确的。如果不是,lis则执行共享的代码时不会列出。
DIRN

我忽略了一件事情。我必须替换列表字典中的双引号,当我这样做时,它显然会将字典列表转换为字符串。我将针对其他问题发布其他问题。
user3089927

0

只是类似问题的旁注(如果我们不想循环通过):

如何在Jinja模板中使用变量键查找字典?

这是一个例子:

{% set key = target_db.Schema.upper()+"__"+target_db.TableName.upper() %}
{{ dict_containing_df.get(key).to_html() | safe }}

这可能是显而易见的。但是我们不需要花括号内的花括号。直接的python语法有效。(我发帖是因为我对我感到困惑...)

或者,您可以简单地执行

{{dict[target_db.Schema.upper()+"__"+target_db.TableName.upper()]).to_html() | safe }}

但是,如果找不到密钥,它将吐出一个错误。因此最好get在Jinja中使用。


0
**get id from dic value. I got the result.try the below code**
get_abstracts = s.get_abstracts(session_id)
    sessions = get_abstracts['sessions']
    abs = {}
    for a in get_abstracts['abstracts']:
        a_session_id = a['session_id']
        abs.setdefault(a_session_id,[]).append(a)
    authors = {}
    # print('authors')
    # print(get_abstracts['authors'])
    for au in get_abstracts['authors']: 
        # print(au)
        au_abs_id = au['abs_id']
        authors.setdefault(au_abs_id,[]).append(au)
 **In jinja template**
{% for s in sessions %}
          <h4><u>Session : {{ s.session_title}} - Hall : {{ s.session_hall}}</u></h4> 
            {% for a in abs[s.session_id] %}
            <hr>
                      <p><b>Chief Author :</b>  Dr. {{ a.full_name }}</p>  
               
                {% for au in authors[a.abs_id] %}
                      <p><b> {{ au.role }} :</b> Dr.{{ au.full_name }}</p>
                {% endfor %}
            {% endfor %}
        {% endfor %}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.