Reputation: 43300
I'm trying to display values from a different list based on the index that is currently being iterated over on another list but cannot figure out how to access the individual items..
{% for row in myarray.all %}
<tr>
<th>{{ my_other_array_where_I_cant_access_elements.forloop.counter }}</th>
<td>{{ row }}</td>
</tr>
{% endfor %}
As you can see I have tried to use forloop.counter
but this doesn't display anything, it just creates an empty table header element.
My other array is defined within the view as the following, and if I remove the forloop.counter
then I am able to see the entire array printed to the table header
my_other_array_where_I_cant_access_elements = ["X", "Y", "Z", "XX", "YY"]
Please let me know if I've missed any required details.
Upvotes: 0
Views: 875
Reputation: 473863
It sounds like you want to iterate over two lists at the same time, in other words zip()
lists.
If this is the case, it is better to do this in the view and pass inside the context:
headers = ["X", "Y", "Z", "XX", "YY"]
data = zip(headers, myarray.all())
return render(request, 'template.html', {'data': data})
Then, in the template:
{% for header, row in data %}
<tr>
<th>{{ header }}</th>
<td>{{ row }}</td>
</tr>
{% endfor %}
Upvotes: 5
Reputation: 2715
There is a possible approach, which I just tried. It only works if you only use the second array as part of a single for loop, though, and does not use the loop index:
arr = ["1-0", "1-1"] # your first array
arr2 = ["2-0", "2-1"] # your second array
class wrap(object):
def __init__(self, ref):
self.ref = ref
self.idx = -1
def next(self):
self.idx += 1
return self.ref[self.idx]
return render_to_response('...', { "arr": arr, "wrap": wrap(arr2) })
And the template is:
{% for row in arr %}
<h1>Row {{ row }} at {{ forloop.counter }} matches {{ wrap.matching }} </h1>
{% endfor %}
Upvotes: 0