簡體   English   中英

如何使用頁碼創建自定義分頁 Class?

[英]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 字段來檢查它是否有下一頁,因為nextprevious字段就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM