Reputation: 190
currently I'm writing a simple todolist with django. I have a view and html file for showing the list of items, and I want a number for each task in the table starting from 1. I'm using {% footloop.counter %}
for that in my template.
Everything was ok until I wrote the paginator. when you choose to go to the next page, the counter starts from 1 again ,therefor the numbers in the table in each page start from one too. but I want the numbers to be continued in order until the last page. Is there any template tags or code snippets for that? Thanks in advance.
here are the codes involved:
**list.html:**
{% for task in tasks %}
<tbody>
<tr>
<th scope="row" class="col-md-1">{{ forloop.counter }}</th>
<td class="col-md-2">{{ task.title }}</td>
<td class="col-md-3">{{ task.description|truncatewords:10 }}</td>
<td class="col-md-2">{{ task.time|date:"H:i" }} - {{ task.time|date:"D d M , Y" }}</td>
</tr>
</tbody>
{% endfor %}
<!--Pagination-->
{% if is_paginated %}
<div class="container p-4">
<div class="pagination justify-content-center">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="{% url 'home:list' 1 %}">« first</a>
<a href="{% url 'home:list' page_obj.previous_page_number %}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{page_obj.paginator.num_pages }}
</span>
{% if page_obj.has_next %}
<a href="{% url 'home:list' page_obj.next_page_number %}">next</a>
<a href="{% url 'home:list' page_obj.paginator.num_pages%}">last »</a>
{% endif %}
</span>
</div>
</div>
{% endif %}
Upvotes: 0
Views: 459
Reputation: 1
You can add the forloop counter with the starting index of the current pagination object in Django template.
{{ forloop.counter0|add:tasks.start_index }}
The reason we use forloop.counter0 instead of forloop.counter is that forloop.counter starts at 1, while forloop.counter0 starts from 0, aligning with the indexing convention.
For further details regarding pagination objects in Django, you can refer to the documentation: https://docs.djangoproject.com/en/5.0/topics/pagination/
Upvotes: 0
Reputation: 1495
You can try to build your own template tag and use it on the template like below :-
@register.filter
def adjust_for_counter(value, page):
value, page = int(value), int(page)
counter_value = value + ((page - 1) * settings.RESULTS_PER_PAGE)
return counter_value
and call it like below in the html :-
{{ forloop.counter|adjust_for_pagination:page }}
For more details you can refer to below link :- https://djangosnippets.org/snippets/1391/
Upvotes: 1