[Django]-Accessing a dict by variable in Django templates?

16👍

There’s no builtin way to do that, you’d need to write a simple template filter to do this: http://code.djangoproject.com/ticket/3371

7👍

Try this to display the keys and values of the dictionary:

{% for key, value in your_dict.items %}
    {{ key }}: {{ value }}
{% endfor %}

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

5👍

Here’s a usage case of the suggested answer.

In this example, I created a generic template for outputting tabular data from a view. Meta data about the columns is held in context[“columnMeta”].

Since this is a dictionary, i cannot rely on the keys to output the columns in order, so i have the keys in a separate list for this.

In my view.py:


c["columns"] = ["full_name","age"]
c["columnMeta"] = {"age":{},"full_name":{"label":"name"}}

In my templatetags file:


@register.filter
def getitem ( item, string ):
  return item.get(string,'')

In my template:

<tr>
<!-- iterate columns in order specified -->
{% for key in columns %}
<th>
 <span class="column-title">
    <!-- look label in meta dict.  If not found, use the column key -->
   {{columnMeta|getitem:key|getitem:"label"|default:key}}
  </span>
</th>
{% endfor %}</tr>
👤Dave

2👍

For my needs, I wanted a single template filter that would work for dicts, lists, and tuples. So, here’s what I use:

@register.filter
def get_item(container, key):
    if type(container) is dict:
        return container.get(key)
    elif type(container) in (list, tuple):
        return container[key] if len(container) > key else None
    return None

Leave a comment