Search code examples
pythondjangopaginator

add django paginator on records


This is my record app views.py, i want to add pagination on result of records list, the list generated by following code and also give solution for templates. Please help me. Thank you.

from django.shortcuts import render
from purchase_report.views import *
import datetime
from datetime import datetime
from purchase_report.models import *
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def display_records(request):
    start_date = request.GET.get('start_date')
    end_date = request.GET.get('end_date')
    purchase_date = PurchaseReport.objects.filter(purchase_date__range=[start_date, end_date])

    return render(request, 'records.html', {'purchase_date': purchase_date,
                                        'start_date': start_date,
                                        'end_date': end_date})

Solution

  • from django.shortcuts import render
    from purchase_report.views import *
    import datetime
    from datetime import datetime
    from purchase_report.models import *
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    def display_records(request):
        start_date = request.GET.get('start_date')
        end_date = request.GET.get('end_date')
        purchase_date = PurchaseReport.objects.filter(purchase_date__range=[start_date, end_date])
        paginator = Paginator(purchase_date, 25) # Show 25 purchase_date per page
    
        page = request.GET.get('page')
        purchase_date = paginator.get_page(page)
    
        return render(request, 'records.html', {'purchase_date': purchase_date,
                                            'start_date': start_date,
                                            'end_date': end_date})
    

    Then in your templates, you can iterate over them normally like

    {% for date in purchase_date %}
        {{ date.<your_model attribute here> }}<br>
        ...
    {% endfor %}
    
    <div class="pagination">
        <span class="step-links">
            {% if purchase_date.has_previous %}
                <a href="?page=1">&laquo; first</a>
                <a href="?page={{ purchase_date.previous_page_number }}">previous</a>
            {% endif %}
    
            <span class="current">
                Page {{ purchase_date.number }} of {{ purchase_date.paginator.num_pages }}.
            </span>
    
            {% if purchase_date.has_next %}
                <a href="?page={{ purchase_date.next_page_number }}">next</a>
                <a href="?page={{ purchase_date.paginator.num_pages }}">last &raquo;</a>
            {% endif %}
        </span>
    </div>
    

    You'd need to style/customize this pagination links however way you like it, but then if you still do not understand it clearly enough to implement your pagination idea. Check https://docs.djangoproject.com/en/2.1/topics/pagination/