[英]How to create a custom Pagination Class with page numbers?
我正在嘗試創建自定義分頁 class。 這是我的嘗試:
class CustomPagination(PageNumberPagination):
page_item_count = 10
page = 1
def get_paginated_response(self, data):
page = self.page
next_page = None
previous_page = None
if page.has_next():
next_page = page.next_page_number()
if page.has_previous():
previous_page = page.previous_page_number()
return Response({
"page_count": page.count,
"result_count": len(data),
"next": next_page,
"previous": previous_page,
"has_next_page": page.has_next(),
"has_previous_page": page.has_previous(),
"result": data,
})
這段代碼現在不能正常工作,這不是我想要的。
我想將查詢集參數作為 page_item_count 和 page。
我想返回類似的東西:
return Response({
"page_count": page.count, # Page count. i.e. there are 100 items, and we show 10 per page, then it must be 10.
"result_count": len(data), # object count. i.e. 100
"next": next_page, # Next page number. It's a number like 2,3,4,5... Not a link
"previous": previous_page, # Prev page number, like 2,3,....
"has_next_page": page.has_next(), # boolean
"has_previous_page": page.has_previous(), # boolean
"result": data, # objects to be returned
})
我怎樣才能做到這一點?
這是您正在尋找的解決方案。 您無需在視圖中執行任何操作。 您可以直接在模板中使用 Django 內置分頁。 這是參考
<!-- Pagination-->
<ul class="pagination justify-content-center mb-4">
{% if page_obj.has_previous %}
<li class="page-item"><a class="page-link" href="?page=1">First Page</a></li>
<li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}">← Back</a></li>
{% endif %}
{% if page_obj.has_next %}
<li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}">Next Page →</a></li>
{% endif %}
{% for i in paginator.page_range %}
{% if page_obj.number == i %}
<li class="page-item"><a class="page-link" href="#!">{{ i }}</a></li>
{% elif i > page_obj.number|add:'-3' and i < page_obj.number|add:'3' %} #change number as your requirement. such as if you have 50 page and how many page number you want to show per page.
<li class="page-item"><a class="page-link" href="?page={{ i }}">{{ i }}</a></li>
{%endif%}
{% endfor %}
<li class="page-item"><a class="page-link" href="?page={{ page_obj.paginator.num_pages }}">Last Page</a></li>
</ul>
</div>
您不需要為 DRF 分頁屬性使用不同的名稱:
class CustomPagination(PageNumberPagination):
page_size = 100 # this is equivalent to your 'page_item_count'
page_size_query_param = 'page_item_count' # this sets the param name for the page size
max_page_size = 1000
要覆蓋分頁響應,您可以:
def get_paginated_response(self, data):
"""
PageNumberPagination response override
"""
return Response(OrderedDict([
('page_count', self.get_page_size(self.request)), # total # on current page
('page_number', int(self.request.query_params.get(self.page_query_param, 1))),
('result_count', self.page.paginator.count), # total # of objects that will be paginated
('next', self.get_next_link()),
('previous', self.get_previous_link()),
('results', data)
]))
您實際上不需要在響應中添加 boolean 字段來檢查它是否有下一頁,因為next
和previous
字段就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.