Django пагинация «бесконечная прокрутка» с некорректным порядком вставки HTMX

Я пытаюсь реализовать пагинацию, известную как «бесконечная прокрутка», с помощью HTMX. Все работает хорошо, за исключением того, что упорядочивание вновь вставляемых объектов не всегда корректно. Например, если просмотреть paginate_by = 10, то первые 10 объектов упорядочиваются как ожидалось, а следующие 10 объектов будут вставлены с некоторыми сбоями в порядке: 7-8 объектов упорядочены как ожидалось, а остальные 2 объекта, которые должны быть в верхней части таблицы, вставлены в конце.

View:

class ShippedProductListView(ListView):
    model = models.Product
    context_object_name = "products"
    paginate_by = 10
    ordering = ['-shipment__shipment_date']

    def get_queryset(self):
        queryset = models.Product.objects.filter(status=models.ProductStatus.SENT)
        return queryset

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['total_count'] = self.get_queryset().count()
        return context

HTML:

<table>
  <!-- some content here -->
    <tbody>
        {% include "production/shipped_products_table.html" with products=products %}
        <!-- Shipped products table updates with htmx -->
    </tbody>
</table>

shipped_products_table.html:

{% for d in products %}
    {% if forloop.last %}
    <tr
        hx-trigger="revealed"
        hx-get="{% url 'shipped_products_list' %}?page={{ page_obj.number|add:1 }}"
        hx-swap="afterend"
        h
    >
    {% else %}
    <tr>   
    {% endif %}
    <tr>
        <td><a class="link-success" href="{% url 'products_detail' sn=d.serial_number %}">{{ d.serial_number }}</a></td>
        <!-- some more content here -->
    </tr>
{% empty %}
    <h5 class="pt-4">Nothing here yet.</h5>
{% endfor %}

Является ли это нормальным поведением или я что-то упускаю?

Ваш набор запросов не упорядочен, что приведет к несоответствию страниц при пагинации:

Для последовательной пагинации наборы запросов должны быть упорядочены, например, с помощью order_by() или по умолчанию ordering в модели.

    def get_queryset(self):
        queryset = models.Product.objects.filter(status=models.ProductStatus.SENT).order_by('-pk')
Вернуться на верх