Як переглядати список словників у шаблоні 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.

Відповіді:


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. Якщо дикт є unicodeоб'єктом, вам доведеться закодуватися в utf-8.


17
Можливо, тому, що я використовую новішу версію jinja, але в моєму випадку мені довелося видалити дужки (use dict_item.items замість цього ), інакше це Could not parse the remainder: '()' from 'dict_item.items()'
викинуло

1
На додаток до відповіді TrakJohnson, я виявив, що новий джинджа індексує диктотриати dict.keyзамість звичайних dict["key"].
Кемерон Хайд

6
@TrakJohnson: тоді ви не використовуєте шаблони Jinja , а використовуєте шаблони Django . Ви хочете прочитати, як переглядати словник у словнику в шаблоні django? . Синтаксис шаблону Django подібний, але не однаковий.
Мартін Пітерс

3
@CameronHyde: Jinja, у всіх версіях, підтримує доступ до атрибутів та елементів до всіх об’єктів. Див. Розділ Змінні документації до шаблону . Якщо у вас dict["key"]не виходить, то ви використовуєте не шаблони Jinja, а шаблони Django. Див. Доступ до словника за ключем у шаблоні Django
Martijn Pieters

1
що, якщо ви хочете використовувати кожен елемент у словнику по-різному - ви не хочете прокручувати ключі, але все одно хочете отримати доступ до ключів?
Legit Stack

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.

як змінити цей код jinja2, якщо розмір dict не фіксований і може змінюватися з часом?
xxxyyyyzzzzz

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

{% for k, v in lis1.items ()%} UndefinedError: 'unicode object' has no attribute 'items'
user3089927

1
@ user3089927 у вашому шаблоні є більше, ніж ви нам показуєте? Це рішення є правильним. Якщо це не так, lisце не список, коли виконується код, яким ви надали доступ.
дір

Я щось пропустив. Мені довелося замінити подвійні лапки у словнику списку, і коли я це роблю, це, очевидно, перетворює список словника у рядок. Я розміщу інші запитання щодо проблеми, з якою я стикаюся.
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 %}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.