How to access list using variable indexes in Django templates

djangodjango-templates

Say, I have two lists of objects, foo and bar. In a Django template, while looping through foo, there's a counter that keeps track of the current index/iteration and the counter is used to access bar. The problem here is I don't think Django template system supports accessing list using variable indexes. Is that true? If so, is there any workaround for the problem (other than repeating the same piece of html/template code with hard-coded indexes)?

Code demonstration:

{% for x in foo %}
  <span>{{ x.name }} vs. {{ bar.{{ forloop.counter0 }}.name }}</span>
{% endfor %}

Django template doesn't like {{ bar.{{ forloop.counter0 }}.name }}

Note: I am using Django 1.4

Best Answer

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