Как передать переменную в параметр per_page в Django Paginator(), чтобы все треки альбома отображались на одной странице?

Я создаю веб-приложение музыкальный плеер, используя Django с Postgres в качестве базы данных.

Сейчас у меня отображается первая песня каждого альбома. При нажатии на кнопку воспроизведения вид меняется на первый трек каждого альбома.

Я хотел бы отобразить все треки для любого альбома на одной странице.

На одной странице будут отображаться такие объекты:

Из альбома: название альбома, исполнитель, художественное оформление_файл и из трека: название трека и аудио_файл для каждого трека в альбоме

Для этого мне нужно передать целое число параметру self.per_page в классе Django's Paginator. В настоящее время он установлен на 1.

Количество треков меняется в зависимости от альбома, поэтому я хочу передать это целое число в качестве переменной (Album.number_tracks). Проблема в том, что я не могу создать queryset для итерации и передать каждую итерацию в self.per_page, потому что функция Paginator берет все объекты сразу, а не объект за объектом. Поэтому я не могу использовать какие-либо условные циклы например:

queryset = Album.objects.all()
number_of_tracks = [a.number_tracks for a in queryset]

Как я могу отобразить все треки из любого альбома на одной странице, независимо от количества песен?

Вот соответствующие поля из models.py:

class Album(models.Model):
    title = models.TextField(blank=False, null=False)
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
    number_tracks = models.TextField(blank=True, null=True)
    track_list = models.TextField(blank=True, null=True)
    artwork_file = models.ImageField(blank=True, null=True, max_length=500)

    def __str__(self):
        return self.title

class Track(models.Model):
    title = models.TextField(blank=False, null=False)
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    artist = models.TextField(blank=True, null=True)
    track_number = models.TextField(blank=True, null=True)
    audio_file = models.FileField(blank=True, null=True, max_length=500)

    def __str__(self):
        return self.title

views.py

def index(request):
    paginator_track = Paginator(Track.objects.order_by('album', 'track_number').all(), 1)
    page_number = request.GET.get('page')
    page_obj_track = paginator_track.get_page(page_number)

    paginator_album = Paginator(Album.objects.order_by('artist', 'title').all(), 1)
    page_number = request.GET.get('page')
    page_obj_album = paginator_album.get_page(page_number)

    context = {'page_obj_album': page_obj_album, 'page_obj_track': page_obj_track}

    return render(request, 'index.html', context)

А в index.html я отображаю объекты так:

{% for album_obj in page_obj_album %}
    <img src='{{ album_obj.artwork_file.url }}' alt='{{ album_obj.artwork_link }}' />
    <h3> {{ album_obj.artist }} </h3>
    <h3> {{ album_obj.title }} </h3>
    {% endfor %}

    {% for track_obj in page_obj_track %}
    <h1> {{ track_obj.title }} </h1>
    <a href='{% if page_obj_track.has_previous %}?page={{ 
     page_obj_track.previous_page_number }} {% endif %}'>
    <i class='fa fa-step-backward fa-2x'></i></a>

    <a href='{% if page_obj_track.has_next %}?page={{page_obj_track.next_page_number}}  {% endif %}'><i class='fa fa-step-forward fa-2x'></i></a>

    <audio class='fc-media'>
    <source src='{% if track_obj.audio_file %} {{ track_obj.audio_file.url }} 
     {% else %} {{ track_obj.audio_link }} {% endif %}'
             type='audio/mp3'/></audio>
   {% endfor %}

На всякий случай, если это поможет кому-нибудь в будущем - я закончил рефакторинг своего кода, чтобы заставить его работать. Вместо встроенной функции Paginator я использовал DetailView. Вот соответствующие части кода:

Я добавил поле slug в models.py для создания URL: slug = AutoSlugField(null=True, default=None, unique=True, max_length=500, populate_from='title')

views.py:

from django.views.generic.detail import DetailView
from datasource.models import Album, Track
class AlbumDetailView(DetailView):

model = Album
template_name = 'album_view.html'

def get_context_data(self, **kwargs):

    context = super(AlbumDetailView, self).get_context_data(**kwargs)
    context['next_album'] = Album.objects.filter(title__gt=self.object.title).order_by('title').first()
    context['prev_album'] = Album.objects.filter(title__lt=self.object.title).order_by('-title').first()
    context['track'] = Track.objects.filter(album=self.object).order_by('track_number')

    return context

В шаблоне HTML вид отображается следующим образом:

{% if prev_album %}
<a href='{% url "album_detail" slug=prev_album.slug %}'><i class='fa fa-step-backward fa-2x'></i></a>
{% endif %}
{% if next_album %}
<a href='{% url "album_detail" slug=next_album.slug %}'><i class='fa fa-step-forward fa-2x'></i></a>
{% endif %}

{% for t in track %}
<h1> {{ t.title }} </h1>
<audio class='fc-media' style='width: 100%;'>
<source src='{% if t.audio_file %} {{ t.audio_file.url }} {% else %} {{ t.audio_link }} {% endif %}'type='audio/mp3'/></audio>
{% endfor %}
Вернуться на верх