0

This is an odd question but I'd like to be able to show the same queryset multiple times on my template using different {% for loops %}, I'm trying to avoid copy pasting each {% for loops %}.

Let's say I have my views.py like this :

...
    chicken = Chicken.objects.filter(id=1)
    return render(request, 'chicken.html', {'chicken':chicken}

chicken.html : the example below is the one I'm avoiding.

<!-- {{ egg }} has the same value everywhere --> 

{% for egg in chicken %} <!-- has a different index than other loops -->
    <p id="egg_1">{{egg}}</p> 
{% endfor %}

{% for egg in chicken %}
    <p id="egg_2">{{egg}}</p>
{% endfor %}

{% for egg in chicken %}
    <p id="egg_3">{{egg}}</p>
{% endfor %}

...x52...

Is there a way to automatise this while having a different index on each loop ?

I'm searching for something like this :

{% for chicken x52 %}
    {% for egg in chicken %}
        <p id="egg_index">{{egg}}</p> <!-- each with different index -->
    {% endfor %}
{% endfor %}
Horai Nuri
  • 5,358
  • 16
  • 75
  • 127

1 Answers1

2

For the example you have given, you could add a variable loops to the context:

chicken = Chicken.objects.filter(id=1)
loops = range(1, 53)
return render(request, 'chicken.html', {'chicken':chicken, 'loops': loops}

Then loop through loops in the template:

{% for loop in loops %}
  {% for egg in chicken %} <!-- has a different index than other loops -->
    <p id="egg_{{ loop }}">{{egg}}</p> 
  {% endfor %}
{% endfor %}

If you don't want to add a variable to the context, there are some different approaches suggested on this question, some hackier than others.

Alasdair
  • 298,606
  • 55
  • 578
  • 516