Wie kann ich eine Liste von Wörterbüchern in der Jinja-Vorlage durchlaufen?

75

Ich habe es versucht:

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

In der Vorlage:

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

Der obige Code teilt jedes Element in mehrere Zeichen auf:

[

{

"

u

s

e

r

...

Ich habe die obige verschachtelte Schleife in einem einfachen Python-Skript getestet und sie funktioniert einwandfrei, aber nicht in der Jinja-Vorlage.

user3089927
quelle

Antworten:

168

Daten:

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

in Jinja2-Iteration:

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

Hinweis:

Stellen Sie sicher, dass Sie die Liste der diktierten Elemente haben. Wenn Sie erhalten, UnicodeErrorkann der Wert innerhalb des Diktats Unicode-Format enthalten. Dieses Problem kann in Ihrem gelöst werden views.py. Wenn das Diktat ein unicodeObjekt ist, müssen Sie es codieren utf-8.

Nava
quelle
17
Könnte daran liegen, dass ich eine neuere Version von Jinja verwende, aber in meinem Fall musste ich die Klammern entfernen ( dict_item.itemsstattdessen verwenden) oder es würde einCould not parse the remainder: '()' from 'dict_item.items()'
TrakJohnson
1
Zusätzlich zu TrakJohnsons Antwort habe ich festgestellt, dass der neue Jinja Dicitonaries mit dict.keyanstelle des konventionellen indiziert dict["key"].
Cameron Hyde
5
@TrakJohnson: Dann verwenden Sie keine Jinja- Vorlagen , sondern Django- Vorlagen. Sie möchten lesen, wie Sie das Wörterbuch in einem Wörterbuch in einer Django-Vorlage durchlaufen? . Die Syntax der Django-Vorlage ist ähnlich, aber nicht gleich.
Martijn Pieters
3
@CameronHyde: Jinja unterstützt in allen Versionen sowohl den Attribut- als auch den Elementzugriff auf alle Objekte. Siehe den Abschnitt Variablen in der Vorlagendokumentation . Wenn dict["key"]dies bei Ihnen nicht funktioniert, verwenden Sie keine Jinja-Vorlagen, sondern Django-Vorlagen. Siehe Zugreifen auf Wörterbuch durch Schlüssel in Django Vorlage
Martijn Pieters
1
Was ist, wenn Sie jedes Element im Wörterbuch auf andere Weise verwenden möchten - Sie möchten die Schlüssel nicht durchlaufen, aber dennoch auf die Schlüssel zugreifen?
Legit Stack
19

Als Nebenbemerkung zu @Navaneethans Antwort Jinja2können "reguläre" Elementauswahl für die Liste und das Wörterbuch vorgenommen werden, vorausgesetzt , wir kennen den Schlüssel des Wörterbuchs oder die Positionen der Elemente in der Liste.

Daten:

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

in Jinja2-Iteration:

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

Die gerenderte Ausgabe:

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.
Chris.Q
quelle
Wie kann man diesen jinja2-Code ändern, wenn die Größe des Diktats nicht festgelegt ist und sich im Laufe der Zeit ändern kann?
xxxyyyyzzzzz
10
{% for i in yourlist %}
  {% for k,v in i.items() %}
    {# do what you want here #}
  {% endfor %}
{% endfor %}
corvid
quelle
{% für k, v in lis1.items ()%} UndefinedError: 'Unicode-Objekt' hat kein Attribut 'items'
user3089927
1
@ user3089927 Enthält Ihre Vorlage mehr, als Sie uns zeigen? Diese Lösung ist richtig. Wenn dies nicht der Fall ist, lishandelt es sich nicht um eine Liste, wenn der von Ihnen freigegebene Code ausgeführt wird.
Dirn
Ich habe etwas übersehen. Ich musste doppelte Anführungszeichen in einem Listenwörterbuch ersetzen und wenn ich es tue, konvertiert es offensichtlich die Liste des Wörterbuchs in eine Zeichenfolge. Ich werde andere Fragen zu dem Problem stellen, mit dem ich konfrontiert bin.
user3089927
0

Nur eine Randnotiz für ein ähnliches Problem (wenn wir nicht durchlaufen wollen):

Wie suche ich ein Wörterbuch mit einem variablen Schlüssel in der Jinja-Vorlage?

Hier ist ein Beispiel:

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

Es könnte offensichtlich sein. Aber wir brauchen keine geschweiften Klammern innerhalb der geschweiften Klammern. Die reine Python-Syntax funktioniert. (Ich poste, weil ich mich verwirrt habe ...)

Alternativ können Sie einfach tun

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

Es wird jedoch ein Fehler ausgegeben, wenn kein Schlüssel gefunden wird. Also besser getin Jinja zu verwenden.

otterb
quelle
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 %}
Nandhini Widder
quelle