[Fixed]-How to access list using variable indexes in Django templates?


Right, you can’t resolve variable names. Definitely try very hard to put this logic in the view.

But 5% of the time, I do find this extremely limiting at times requiring too much logic in the view / changes required outside the template authors control. I’ve come to accept a few personal customizations, allowing for variable assignment within the view as well as simple variable resolution.

It’s quite simple to build a template tag that does so though, using the template engines “all lookups in one” system (index, attribute, key).

from django.template import Variable, VariableDoesNotExist

def resolve(lookup, target):
        return Variable(lookup).resolve(target)
    except VariableDoesNotExist:
        return None

{% resolve some_list some_index as value %}
{% resolve some_dict some_dict_key as value %}


You are correct that Django templates do not directly allow this, and it’s because Django tries to force you to put pretty much all your presentation logic in your views. Your best option is to make a list of dicts in your context in your view, so you can iterate of that and access the members by name. Or:

  • zip your lists together instead of making them a dict and access them using {% for fooItem, barItem in zippedList %}.
  • use a less limiting templating language, like Jinja2
  • use a custom template filter, as suggested by Yuji Tomita

Leave a comment