Django | sort dict in template


I want to print out a dictionary, sorted by the key. Sorting the keys is easy in the view, by just putting the keys in a list and then sorting the list. How can I loop through the keys in the template and then get the value from the dictionary.

{% for company in companies %}
    {% for employee, dependents in %}
    {% endfor %}
{% endfor %}

(Just made up the example...) The part that doesn't work is the "" part. I need the "company" to be the value of company. Right now the company prat is looking for a key named "company" not the value of "company" from the loop above.

I'm doing a bit of processing to put the dictionary of dictionaries together. Changing the layout of the data isn't really an option. I figure the right approach is to write up a template tag, just wanted to know if there was a built-in way I missed.

1/8/2010 12:13:50 AM

Accepted Answer

try this:

a custom template filter will do the trick.

from django import template
register = template.Library()

def dict_get(value, arg):
    #custom template tag used like so:
    #where dictionary is duh a dictionary and var is a variable representing
    #one of it's keys

    return value[arg]


more on custom template filters:

in your example you'd do:

{% for employee, dependents in company_dict|company %}
1/8/2010 12:37:55 AM

create a custom filter, which is like this:

from django import template
from django.utils.datastructures import SortedDict

register = template.Library()

def listsort(value):
    if isinstance(value, dict):
        new_dict = SortedDict()
        key_list = sorted(value.keys())
        for key in key_list:
            new_dict[key] = value[key]
        return new_dict
    elif isinstance(value, list):
        return sorted(value)
        return value
    listsort.is_safe = True

then in your template you shall call it using:

{% for key, value in companies.items|sort %}
      {{ key }} {{ value }}
{% endfor %}

You will be able to get the sorted dict by Key.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow