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')