django-分页

一 创建分页视图类
from .models import Data
from django.views.generic import ListView
class DataListView(ListView):
    model = Data
    # 渲染的页面
    template_name = 'index.html'
    # 上下文名字
    context_object_name = 'datas'
    # 每一页展示多少条数据
    paginate_by = 20
    ordering = 'code'
    page_kwarg = 'p'

    # 获取上下文处理器
    def get_context_data(self, **kwargs):
        context = super(DataListView, self).get_context_data(*kwargs)
        paginator = context.get('paginator')
        page_obj = context.get('page_obj')
        pagination_data = self.get_pagintion_data(paginator, page_obj)
        context.update(pagination_data)
        return context

    def get_pagintion_data(self, paginator, page_obj, around_count=2):
        current_page = page_obj.number
        num_pages = paginator.num_pages

        # 显示...
        left_has_more = False
        right_has_more = False

        if current_page <= around_count + 2:
            left_pages = range(1, current_page)
        else:
            left_has_more = True
            left_pages = range(current_page - around_count, current_page)

        if current_page >= num_pages - around_count - 1:
            right_pages = range(current_page + 1, num_pages + 1)
        else:
            right_has_more = True
            right_pages = range(current_page + 1, current_page + around_count + 1)

        return {
            'left_pages': left_pages,
            'right_pages': right_pages,
            'current_page': current_page,
            'left_has_more': left_has_more,
            'right_has_more': right_has_more,
            'num_pages': num_pages
        }

二 配置url映射

path('list/', views.DataListView.as_view(), name="list")

三 渲染前端页面

<ul class="pagination pagination-sm">
                    {#是否还有上一页#}
                    {% if page_obj.has_previous %}
                        <li><a href="{% url 'data:list' %}?p={{ page_obj.previous_page_number }}">上一页</a></li>
                    {% else %}
                        <li class="disabled"><a href="javascript:void(0)">上一页</a></li>
                    {% endif %}


                    {# 中间的页码 #}
                    {# 是否显示左边... #}
                    {% if left_has_more %}
                        <li><a href="{% url 'data:list' %}?p=1">首页</a></li>
                        <li><a href="javascript:void(0)">...</a></li>
                    {% endif %}

                    {# 左边的代码 #}
                    {% for left_page in left_pages %}
                        <li><a href="{% url 'data:list' %}?p={{ left_page }}">{{ left_page }}</a></li>
                    {% endfor %}

                    {# 当前的页码 #}
                    <li class="active"><a href="{% url 'data:list' %}?p={{ current_page }}">{{ current_page }}</a></li>

                    {# 右边的页码 #}
                    {% for right_page in right_pages %}
                        <li><a href="{% url 'data:list' %}?p={{ right_page }}">{{ right_page }}</a></li>
                    {% endfor %}

                    {# 是否显示右边... #}
                    {% if right_has_more %}
                        <li><a href="javascript:void(0)">...</a></li>
                        <li><a href="{% url 'data:list' %}?p={{ num_pages }}">尾页</a></li>
                    {% endif %}



                    {# 下一页 #}
                    {% if page_obj.has_next %}
                        <li><a href="{% url 'data:list' %}?p={{ page_obj.next_page_number }}">下一页</a></li>
                    {% else %}
                        <li class="disabled"><a href="javascript:void(0)">下一页</a></li>
                    {% endif %}

                </ul>
原文地址:https://www.cnblogs.com/renshaoqi/p/10875361.html