2011-11-05 21 views
70

Mój słownik wygląda następująco (Słownik w słowniku):jak iterować przez słownik w słowniku w szablonie django?

{ '0': { 'chosen_unit', 'koszt': Decimal ('10 0,0000'), 'unit__name_abbrev': u'G "," dostawca_ dostawca ": u" Mięso Steve'a Szafka "," cena ": Dziesiętny (" 5,00 ")," dostawca _address ": u'No \ r \ naddress here", "selected_unit_amount": u ' 2' , 'city_ name': u'Joburg, Central”, 'dostawca _phone_number': u'02299944444' , 'supplier_ internetowej': None, 'dostawca _price_list' u '', 'supplier_ email': u'[email protected] ' 'jednostka _name': u'Gram', 'name': u'Rump Bone '}}

Teraz ja' Właśnie próbuję wyświetlić informacje na moim szablonie, ale walczę. Mój kod dla szablonu wygląda następująco:

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

Po prostu pokazuje mi "0" na moim szablonie?

Próbowałem również:

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

To nawet nie wyświetla wynik.

Myślałem, że może muszę iteracyjne jeden poziom głębiej więc próbowałem:

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

Ale to nic nie wyświetla.

Co robię źle?

Odpowiedz

163

Powiedzmy dane są -

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

Można użyć metody data.items() uzyskać słownikowe elementy. Uwaga, w szablonach django NIE umieszczamy (). Również niektórzy użytkownicy wymienieni values[0] nie działają, jeśli tak jest, spróbuj wtedy 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> 

Jestem pewien, że można rozszerzyć tę logikę do konkretnego dict.


iteracyjne nad klucze DICT w posortowanych - Najpierw porządek w Pythonie następnie iteracyjne & renderowania w szablonie Django.

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

W pliku szablonu:

{% for key, value in data %} 
    <tr> 
     <td> Key: {{ key }} </td> 
     <td> Value: {{ value }} </td> 
    </tr> 
{% endfor %} 
+1

dzięki za odpowiedź. Mam nazwę receptury o jeden poziom wyżej i nie pokazałem tego poziomu słownika. Dziękuję za Twoją odpowiedź! Nie mogłem użyć 'values ​​[0]' zamiast tego musiałem "value.items' – darren

+0

cool! Cieszę się, że mogę podzielić się tym, co wiedziałem. Kod został wpisany wolną ręką, więc niektóre błędy są nieuniknione. –

+1

Dzięki za wzmianka o '.items'. Dokumentacja 'https: // docs.djangoproject.com/pl/1.4/topics/templates /' podaje przykład, który nie działa, ale nie ma przykładu, który działa. '{% dla k, v na etykiecie%}' daje dziwne wyniki - k jest pierwszym znakiem każdego klawisza, a v jest puste, natomiast '{% dla k w poleceniu%}' zwraca pełny klucz, ale bez możliwości odzyskania wartości (ponieważ 'dict.k' traktuje k jako literalną postać). – Dave