Search code examples
pythondjangodjango-viewspaginator

pagination does not work for numbers in between and also for reverse in django


I am filtering my data, and also applying paginator, I have found some solution and I used it but it is working only for the next button and not for previous and button numbers in between i.e. for {{i}} (Django, python)

this is template_tag file myapp_extra.py

from django import template

register = template.Library()

@register.simple_tag

def my_url(value, field_name, urlencode=None):
    url = '?{}={}'.format(field_name, value)

    if urlencode:
        querystring = urlencode.split('&')
        filterd_querystring = filter(lambda p: p.split('=')[0]!=field_name, querystring)
        encoded_querystring = '&'.join(filterd_querystring)
        url = '{}&{}'.format(url, encoded_querystring)

    return url

in my html

{% load myapp_extra %}
<other code>
<nav>
          <ul class="pagination rounded-separated justify-content-center" style="float: right; margin-top: 1%;">
            {% if employees_attendance_list.has_previous %}
            <li class="page-item"><a class="page-link" href="{% my_url employees_attendance_list.previous_page_number 'page' request.GET.urlencode }"><i class="mdi mdi-chevron-left"></i></a></li>
            {% else %}
            <li class="disabled"></li>
            {% endif %}
            
            {% for i in employees_attendance_list.paginator.page_range %}
            {% if employees_attendance_list.number == i %}
            <li class="page-item active"><a class="page-link" >{{ i }}</a></li>
            {% else %}
            <li class="page-item"><a class="page-link" href="{% my_url i 'page' request.GET.urlencode}">{{ i }}</a></li>
            {% endif %}
            {% endfor %}
            {% if employees_attendance_list.has_next %}
            <li class="page-item"><a class="page-link" href="{% my_url employees_attendance_list.next_page_number 'page' request.GET.urlencode %}"><i class="mdi mdi-chevron-right"></i></a></li>
            {% else %}
            <li class="disabled"></li>
            {% endif %}
          </ul>
        </nav>

in views

  page = request.GET.get('page', 1)
    paginator = Paginator(employees_attendance, settings.PAGE_LIMIT)
    
    try:
        employees_attendance_list = paginator.page(page)
    except PageNotAnInteger:
        employees_attendance_list = paginator.page(1)
    except EmptyPage:
        employees_attendance_list = paginator.page(paginator.num_pages)

Solution

  • I have made some changes in my html

            <nav>
              <ul class="pagination rounded-separated justify-content-center" style="float: right; margin-top: 1%;">
              {% for i in employees_attendance_list.paginator.page_range %}
                <li class="page-item">
                  <a class="page-link" href="{% my_url i 'page' request.GET.urlencode %}">{{ i }}</a>
                </li>
              {% endfor %}
            </ul>
            </nav>