darren darren - 6 months ago 19
Python Question

how to iterate through dictionary in a dictionary in django template?

My dictionary looks like this(Dictionary within a dictionary):


{'0': {'chosen_unit': , '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'ss.sss@ssssss.com', 'unit_name': u'Gram',
'name': u'Rump Bone'}}


Now I'm just trying to display the information on my template but I'm struggling. My code for the template looks like:

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


It just shows me '0' on my template?

I also tried:

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


This doesn't even display a result.

I thought perhaps I need to iterate one level deeper so tried this:

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


But this doesn't display anything.

What am I doing wrong?

Answer

Lets say your data is -

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

You can use the data.items() method to get the dictionary elements. Note, in django templates we do NOT put ()

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

Am pretty sure you can extend this logic to your specific dict.


To iterate over dict keys in a sorted order - AFAIK Its not totally possible in templates. I present below sorting in python & iterating & rendering in templates.

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

Then In template file:

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