Django自定义分页器

自定义分页器基本思路

1. 获取用户想要访问的页码数

2. 每页展示条数

3. 每页的起始位置和终止位置

4. 统计数据库中数据的总条数

5. 计算展示所有数据需要多少页

6. 定义页码显示数量及规则

7. 查询用户想要查看的页码内容并返回

后端代码基本思路如下

def page_content(request):
    # 1. 获取用户想要访问的页码数
    current_page = int(request.POST.get('page'))        # 'page'为前端定义的页码

    # 2. 每页展示条数
    per_page_num = 10       # 每页展示10条数据

    # 3. 每页的起始位置和终止位置
    page_start = (current_page - 1) * per_page_num
    page_end = current_page * per_page_num

    # 4. 统计数据库中数据的总条数
    book_queryset = models.Book.objects.all()
    all_count = book_queryset.count()

    # 5. 计算展示所有数据需要多少页
    page_num, more = divmod(all_count, per_page_num)
    if more:
        page_num += 1

    # 6. 定义页码显示数量及规则
    page_html = ''
    middle_page = current_page
    if middle_page < 6:
        middle_page = 6
    for i in range(current_page - 5, current_page + 6):
        if middle_page == i:
            page_html += f'<li class="active"><a href="?page={i}">{i}</a></li>'
        else:
            page_html += f'<li><a href="?page={i}">{i}</a></li>'

    # 7. 查询用户想要查看的页码内容并返回
    book_queryset = book_queryset[page_start: page_end]
    return render(request, 'page_content.html', locals())

一个已经封装好的分页器代码

分页器代码

# app01/utils/mypage.py     自定义工具一般放在应用的utils文件夹下
class Pagination(object):
    def __init__(self, current_page, all_count, per_page_num=10, pager_count=11):
        """
        封装分页相关数据
        :param current_page: 当前页
        :param all_count:    数据库中的数据总条数
        :param per_page_num: 每页显示的数据条数
        :param pager_count:  最多显示的页码个数

        用法:
        queryset = model.objects.all()
        page_obj = Pagination(current_page,all_count)
        page_data = queryset[page_obj.start:page_obj.end]
        获取数据用page_data而不再使用原始的queryset
        获取前端分页样式用page_obj.page_html
        """
        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1

        if current_page < 1:
            current_page = 1

        self.current_page = current_page

        self.all_count = all_count
        self.per_page_num = per_page_num

        # 总页码
        all_pager, tmp = divmod(all_count, per_page_num)
        if tmp:
            all_pager += 1
        self.all_pager = all_pager

        self.pager_count = pager_count
        self.pager_count_half = int((pager_count - 1) / 2)

    @property
    def start(self):
        return (self.current_page - 1) * self.per_page_num

    @property
    def end(self):
        return self.current_page * self.per_page_num

    def page_html(self):
        # 如果总页码 < 11个:
        if self.all_pager <= self.pager_count:
            pager_start = 1
            pager_end = self.all_pager + 1
        # 总页码  > 11
        else:
            # 当前页如果<=页面上最多显示11/2个页码
            if self.current_page <= self.pager_count_half:
                pager_start = 1
                pager_end = self.pager_count + 1

            # 当前页大于5
            else:
                # 页码翻到最后
                if (self.current_page + self.pager_count_half) > self.all_pager:
                    pager_end = self.all_pager + 1
                    pager_start = self.all_pager - self.pager_count + 1
                else:
                    pager_start = self.current_page - self.pager_count_half
                    pager_end = self.current_page + self.pager_count_half + 1

        page_html_list = []
        # 添加前面的nav和ul标签
        page_html_list.append('''
                    <nav aria-label='Page navigation>'
                    <ul class='pagination'>
                ''')
        first_page = '<li><a href="?page=%s">首页</a></li>' % (1)
        page_html_list.append(first_page)

        if self.current_page <= 1:
            prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
        else:
            prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page - 1,)

        page_html_list.append(prev_page)

        for i in range(pager_start, pager_end):
            if i == self.current_page:
                temp = '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i,)
            else:
                temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,)
            page_html_list.append(temp)

        if self.current_page >= self.all_pager:
            next_page = '<li class="disabled"><a href="#">下一页</a></li>'
        else:
            next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page + 1,)
        page_html_list.append(next_page)

        last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)
        page_html_list.append(last_page)
        # 尾部添加标签
        page_html_list.append('''
                                           </nav>
                                           </ul>
                                       ''')
        return ''.join(page_html_list)

后端代码

# views.py
from app01.utils.mypage import Pagination

def check_book(request):
    # 获取要展示数据的信息-->数据,用户点击页码,所有条数
    book_queryset = models.Book.objects.all()
    current_page = request.POST.get('page', 1)      # 当前点击页码,没有携带默认为1
    all_count = book_queryset.count()

    # 1.实例化产生对象
    page_obj = Pagination(current_page=current_page, all_count=all_count)

    # 2.对数据进行切片操作
    page_queryset = book_queryset[page_obj.start: page_obj.end]
    return render(request, 'check_book.html', locals())

前端代码

{# check_book.html #}
{% for book_obj in page_queryset %}
<p>{{ book_obj.title }}</p>
{% endfor %}
{{ page_obj.apge_html|safe }}

原文地址:https://www.cnblogs.com/zj420255586/p/11760801.html

时间: 2024-10-09 13:11:46

Django自定义分页器的相关文章

16 Django 自定义分页器

目录 前言 自定义分页器 前言 当用户输入URL时,我在前端页面显示的数据,假设有1万条数据,用脑子想一想不可能将这一万条数据全部都展示在当前一个页面上去给用户直接看把,这样虽然后端方便了,但是如果你是开发一个上线的项目,用户体验贼差,那这个项目岂不是费了,所以我们在浏览别人的网站的时候,就好比博客园来说把,它是每一页都展示那规定的几条数据,当用户想看其他的数据,需要点击其他页,查看其它页的数据 下面我们就来看一下分页器怎么用 自定义分页器 说明:django帮我们封装了分页器的代码方法,我们只

django自定义分页器组件

class Pagination(object): def __init__(self,current_page,all_count,per_page_num=2,pager_count=11): """ 封装分页相关数据 :param current_page: 当前页 :param all_count: 数据库中的数据总条数 :param per_page_num: 每页显示的数据条数 :param pager_count: 最多显示的页码个数 用法: queryset

Django分页器及自定义分页器

Django的分页器 view from django.shortcuts import render,HttpResponse # Create your views here. from app01.models import * from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def index(request): ''' 批量导入数据: Booklist=[] for i in range(

Django 批量插入数据、自定义分页器、多表关系的建立及Form组件(待更新。。。)

目  录 django批量出入数据 自定义分页器 创建多对多表关系的建立 form组件 form组件钩子函数 一.django批量出入数据 视图函数: from app01 import models # 向表中插入1000条数据 def index(request): # 方式1: # for i in range(1000): # models.Book.objects.create(title='第%s本书'%i) # book_Queryset = models.Book.objects

Django之分页器组件与自定义

Django之分页器组件 class Pagination(object): def __init__(self,current_page,all_count,per_page_num=2,pager_count=11): """ 封装分页相关数据 :param current_page: 当前页 :param all_count: 数据库中的数据总条数 :param per_page_num: 每页显示的数据条数 :param pager_count: 最多显示的页码个数

Django框架进阶6 多对多三种创建方式, Ajax, Content-Type前后端传输数据编码格式, Ajax发送文件数据, django内置的序列化功能, Ajax结合sweetalert实现删除二次确认, 批量插入数据, 自定义分页器, ajax结合sweetalert实现删除二次确认

多对多三种创建方式 1.全自动(较为常用) class Book(models.Model): title = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author') # orm就会自动帮你创建第三张表 class Author(models.Model): name = models.CharField(max_length=32) ''' 好处:第三张表自己创建 不足之处:第三张表无法扩展额外

Django组件——分页器和中间件

分页器 Django内置分页器(paginator) 分页器函数为paginator,里面有几个重要的参数需要我们了解 paginator = Paginator(book_list, 10) #第二个参数表示每页显示的数量 paginator.count) #数据总数 paginator.num_pages #总页数 paginator.page_range #页码的列表 page1=paginator.page(1) #第1页的page对象 for i in page1: #遍历第1页的所有

2019年6月14日 Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端传输数据编码格式contentType 批量插入数据和自定义分页器 一.MVC与MTV MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式,所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求. M

Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07

目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Ajax 实现效果 contentType 前后端传输数据编码格式 ajax 提交数据 ajax发 json 格式数据 ajax 传文件 序列化组件 利用 sweetalert 搭建页面(弹窗) 弹窗中文支持不太好,手动修改样式 页面数据没刷新的问题 自定义分页器 批量插入测试数据 bulk_creat