Wie iteriere ich durch ein Wörterbuch in einem Wörterbuch in einer Django-Vorlage?

128

Mein Wörterbuch sieht folgendermaßen aus (Wörterbuch innerhalb eines Wörterbuchs):

{'0': {
    'chosen_unit': <Unit: Kg>,
    'cost': Decimal('10.0000'),
    'unit__name_abbrev': u'G',
    'supplier__supplier': u"Steve's Meat Locker",
    'price': Decimal('5.00'),
    'supplier__address': u'No\r\naddress here',
    'chosen_unit_amount': u'2',
    'city__name': u'Joburg, Central',
    'supplier__phone_number': u'02299944444',
    'supplier__website': None,
    'supplier__price_list': u'',
    'supplier__email': u'[email protected]',
    'unit__name': u'Gram',
    'name': u'Rump Bone',
}}

Jetzt versuche ich nur, die Informationen in meiner Vorlage anzuzeigen, aber ich habe Probleme. Mein Code für die Vorlage sieht folgendermaßen aus:

{% if landing_dict.ingredients %}
  <hr>
  {% for ingredient in landing_dict.ingredients %}
    {{ ingredient }}
  {% endfor %}
  <a href="/">Print {{ landing_dict.recipe_name }}</a>
{% else %}
  Please search for an ingredient below
{% endif %}

Es zeigt mir nur '0' auf meiner Vorlage?

Ich habe auch versucht:

{% for ingredient in landing_dict.ingredients %}
  {{ ingredient.cost }}
{% endfor %}

Dies zeigt nicht einmal ein Ergebnis an.

Ich dachte, ich muss vielleicht eine Ebene tiefer iterieren, also habe ich Folgendes versucht:

{% if landing_dict.ingredients %}
  <hr>
  {% for ingredient in landing_dict.ingredients %}
    {% for field in ingredient %}
      {{ field }}
    {% endfor %}
  {% endfor %}
  <a href="/">Print {{ landing_dict.recipe_name }}</a>
{% else %}
  Please search for an ingredient below
{% endif %}

Dies zeigt aber nichts an.

Was mache ich falsch?

Darren
quelle

Antworten:

258

Nehmen wir an, Ihre Daten sind -

data = {'a': [ [1, 2] ], 'b': [ [3, 4] ],'c':[ [5,6]] }

Sie können die data.items()Methode verwenden, um die Wörterbuchelemente abzurufen. Beachten Sie, dass wir in Django-Vorlagen NICHT setzen (). Auch einige der genannten Benutzer values[0]funktionieren nicht. Wenn dies der Fall ist, versuchen Sie es values.items.

<table>
    <tr>
        <td>a</td>
        <td>b</td>
        <td>c</td>
    </tr>

    {% for key, values in data.items %}
    <tr>
        <td>{{key}}</td>
        {% for v in values[0] %}
        <td>{{v}}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</table>

Ich bin mir ziemlich sicher, dass Sie diese Logik auf Ihr spezifisches Diktat erweitern können.


So iterieren Sie über Diktierschlüssel in einer sortierten Reihenfolge : Zuerst sortieren wir in Python, dann iterieren und rendern wir in einer Django-Vorlage.

return render_to_response('some_page.html', {'data': sorted(data.items())})

In der Vorlagendatei:

{% for key, value in data %}
    <tr>
        <td> Key: {{ key }} </td> 
        <td> Value: {{ value }} </td>
    </tr>
{% endfor %}
Srikar Appalaraju
quelle
2
Danke für deine Antwort. Ich habe Rezeptname eine Ebene höher und habe diese Ebene des Wörterbuchs nicht angezeigt. Vielen Dank für Ihre Antwort! Ich konnte nicht verwenden, values[0]stattdessen musste ichvalues.items
darren
cool! Ich bin froh zu teilen, was ich wusste. Der Code wurde freihändig eingegeben, daher sind einige Fehler unvermeidlich.
Srikar Appalaraju
1
Vielen Dank für die Erwähnung .items. Die Dokumentation https://docs.djangoproject.com/en/1.4/topics/templates/enthält ein Beispiel, das nicht funktioniert, aber kein Beispiel, das funktioniert. {% for k,v in dict %}gibt bizarre Ergebnisse - k ist das erste Zeichen jedes Schlüssels und v ist leer, während {% for k in dict %}der vollständige Schlüssel zurückgegeben wird, jedoch keine Möglichkeit zum Abrufen von Werten besteht (da dict.kk als Literalzeichen behandelt wird).
Dave
2
Upvoted :-). Für zukünftige Leser https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#fordokumentieren die Tags und Filter dies zusammen mit den Forloop-Variablen, die beim Formatieren einer Liste hilfreich sein können.
Dave
1
values.items+1
Kevin_TA
3

Diese Antwort hat bei mir nicht funktioniert, aber ich habe die Antwort selbst gefunden. Niemand hat jedoch meine Frage gestellt. Ich bin zu faul, um es zu fragen und dann zu beantworten, also werde ich es einfach hier einfügen.

Dies ist für die folgende Abfrage:

data = Leaderboard.objects.filter(id=custom_user.id).values(
    'value1',
    'value2',
    'value3')

In Vorlage:

{% for dictionary in data %}
  {% for key, value in dictionary.items %}
    <p>{{ key }} : {{ value }}</p>
  {% endfor %}
{% endfor %}
crappy_hacker
quelle
0

Wenn Sie eine Variable data(Wörterbuchtyp) als Kontext an eine Vorlage übergeben, sollte Ihr Code wie folgt lauten:

{% for key, value in data.items %}
    <p>{{ key }} : {{ value }}</p> 
{% endfor %}
Eugene Chabanov
quelle