¿Cómo iterar a través del diccionario en un diccionario en la plantilla django?

128

Mi diccionario se ve así (Diccionario dentro de un diccionario):

{'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',
}}

Ahora solo estoy tratando de mostrar la información en mi plantilla pero estoy luchando. Mi código para la plantilla se ve así:

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

¿Simplemente me muestra '0' en mi plantilla?

También probé:

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

Esto ni siquiera muestra un resultado.

Pensé que tal vez necesito iterar un nivel más profundo, así que intenté esto:

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

Pero esto no muestra nada.

¿Qué estoy haciendo mal?

Darren
fuente

Respuestas:

258

Digamos que sus datos son -

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

Puede usar el data.items()método para obtener los elementos del diccionario. Nota, en las plantillas de django NO ponemos (). Además, algunos usuarios mencionados values[0]no funcionan, si ese es el caso, intente 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>

Estoy bastante seguro de que puede extender esta lógica a su dict específico.


Para iterar sobre las teclas dict en un orden ordenado : primero ordenamos en python, luego iteramos y renderizamos en la plantilla django.

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

En archivo de plantilla:

{% for key, value in data %}
    <tr>
        <td> Key: {{ key }} </td> 
        <td> Value: {{ value }} </td>
    </tr>
{% endfor %}
Srikar Appalaraju
fuente
2
gracias por tu respuesta. Tengo receta_nombre un nivel más arriba y no mostré ese nivel del diccionario. ¡Gracias por su respuesta! No pude usar values[0]en su lugar, tuve que hacerlovalues.items
darren
¡frio! Me alegra compartir lo que sabía. El código se escribió a mano alzada, por lo que algunos errores son inevitables.
Srikar Appalaraju
1
Gracias por mencionar .items. La documentación https://docs.djangoproject.com/en/1.4/topics/templates/da un ejemplo que no funciona, pero ningún ejemplo que sí funcione. {% for k,v in dict %}da resultados extraños: k es el primer carácter de cada clave y v está en blanco, mientras que {% for k in dict %}devuelve la clave completa pero sin forma de recuperar valores (ya que dict.ktrata a k como un carácter literal).
Dave
2
Votado a favor :-). Para futuros lectores, las etiquetas y los filtros hacen referencia a https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#foresto, junto con las variables forloop que pueden ser útiles al formatear una lista.
Dave
1
values.items+1
Kevin_TA
3

Esta respuesta no funcionó para mí, pero encontré la respuesta yo mismo. Sin embargo, nadie ha publicado mi pregunta. Soy demasiado vago para preguntarlo y luego responderlo, así que lo pondré aquí.

Esto es para la siguiente consulta:

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

En plantilla:

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

Si pasa una variable data(tipo de diccionario) como contexto a una plantilla, entonces el código debe ser:

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