Search code examples
pythondjangodjango-filterdjango-pagination

paginate by a number of objects django


So pagination isn't working even without initiating django-filters from templates, I'm not able to paginate by the number of objects I want, it's showing all of them at once

*Note: I'm not saying both should work together(pagination and django-filter), just that I wanna fix the pagination

views.py

def music_page(request):

    #pagination & filter

    music = Music.objects.all().order_by('-id')
    music_filter = MusicFilter(request.GET, queryset=music)
    paginator = Paginator(music, 6)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    try:
        music = paginator.page(page_number)
    except PageNotAnInteger:
        music = paginator.page(1)
    except EmptyPage:
        music.paginator.page(paginator.num_pages)

    return render(request, template_name='main/music.html', context={'music': music, 'page_obj': page_obj, 'filter': music_filter})

template

<div class='card'>
    {% for m in filter.qs %}
        <div class='year'>{{m.Year}}</div>
        <div class='song_name'>{{m.song}}</div>
    {% endfor %}
</div>

Solution

  • Firstly, you are not passing in the correct queryset. You need to pass in the filtered queryset instead of music.

    music = Music.objects.all().order_by('-id')
    music_filter = MusicFilter(request.GET, queryset=music)
    
    filtered_music = music_filter.qs
    paginator = Paginator(filtered_music, 6)
    

    Then in your template you have to loop through this page_obj in order to get your objects.

    <div class='card'>
        {% for m in page_obj %}
            <div class='year'>{{m.Year}}</div>
            <div class='song_name'>{{m.song}}</div>
        {% endfor %}
    </div>