Пагинация продолжает показывать следующую страницу, когда отфильтрованные данные не достигли минимального значения paginate_by
Мое первое приложение получает запрос от моего второго приложения с помощью requests.get, пагинация работает нормально, когда я показываю все данные, но когда я использую фильтр, пагинация продолжает отображаться, даже когда недостаточно данных для пагинации
первое приложение views.py :
class Index(LoginRequiredMixin, ListView):
model = Transaction
template_name = 'transaction/transaction-list.html'
paginate_by = 10
def get_context_data(self, **kwargs):
context = super(Index, self).get_context_data(**kwargs)
status = self.request.GET.get("q", "all")
if status != "all":
get_data = requests.get(url).json()
transaction_list = get_data["data"]
context['transaction'] = transaction_list
p = Paginator(context['transaction'], self.paginate_by)
context['transaction'] = p.page(context['page_obj'].number)
context['query'] = 'q='+status
else:
url = 'http://127.0.0.1:8005/api/transaction/'
get_data = requests.get(url).json()
transaction_list = get_data["data"]
context['transaction'] = transaction_list
p = Paginator(context['transaction'], self.paginate_by)
context['transaction'] = p.page(context['page_obj'].number)
return context
второе приложение views.py:
def get(self, request, id=None, query=None):
if query == 'Success' or query == 'Failed' or query == 'Approval' or query == 'Rejected' or query == 'Cancelled':
items = Transaction.objects.filter(status__icontains=query)
serializer = TransactionSerializer(items, many=True)
return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
else:
if id:
item = Transaction.objects.get(transaction_id=id)
serializer = TransactionSerializer(item)
return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
items = Transaction.objects.all()
counts = self.fetch_count_data()
serializer = TransactionSerializer(items, many=True)
return Response({"status": "success", "data": serializer.data, "counts":counts}, status=status.HTTP_200_OK)
pagination html :
<nav class="pagination">
<ul>
{% if not page_obj.has_previous %}
<li>
<a href="#" class="btn btn--secondary btn--icon btn--disabled">
</a>
</li>
{% elif page_obj.previous_page_number == 1 %}
<li>
<a href="?{{ query }}&page=1" class="btn btn--secondary btn--icon">
</a>
</li>
{% else %}
<li>
<a href="?{{ query }}&page={{ page_obj.previous_page_number }}" class="btn btn--secondary btn--icon">
</a>
</li>
{% endif %}
{% for num in page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<li><a href="#" class="btn btn--primary btn--icon btn--disabled">{{ num }}</a></li>
{% else %}
{% if num == 1 %}
<li><a href="?{{ query }}&page=1" class="btn btn--secondary btn--icon">{{ num }}</a></li>
{% else %}
{% if num|add:"-3" <= page_obj.number and page_obj.number <= num|add:"3" %}
<li><a href="?{{ query }}&page={{ num }}" class="btn btn--secondary btn--icon ">{{ num }}</a></li>
{% elif num|divisibleby:"50" or num == page_obj.paginator.num_pages %}
<li><a href="?{{ query }}&page={{ num }}" class="btn btn--secondary btn--icon ">{{ num }}</a></li>
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if not page_obj.has_next %}
<li>
<a href="#" class="btn btn--secondary btn--icon btn--disabled">
</a>
</li>
{% else %}
<li>
<a href="?{{ query }}&page={{ page_obj.next_page_number }}" class="btn btn--secondary btn--icon">
</a>
</li>
{% endif %}
</ul>
</nav>
Допустим, у меня есть 3 страницы, когда я показываю все данные, но когда я фильтрую по статусу успеха, есть только 2 данных со статусом успеха, но список продолжает показывать 3 страницы, когда я нажимаю на 2-ю и 3-ю страницу, возникает ошибка "нет данных"
Почему это происходит? Что нужно сделать, чтобы скрыть пагинацию, когда недостаточно данных для пагинации?