美文网首页
分页功能的实现

分页功能的实现

作者: SlashBoyMr_wang | 来源:发表于2018-08-24 17:26 被阅读0次

直接上代码吧:

基础版

import math


class Page:

    def __init__(self, total_num, page_num, every_page_num=10, show_page_num=9):
        """
        :param total_num: 数据库获取到的数据的总数
        :param page_num: 前端获取的页数
        :param every_page_num: 自定义每页显示条数
        :param show_page_num: 显示分页数目
        """
        self.total_num = total_num
        self.page_num = page_num
        self.every_page_num = every_page_num
        self.show_page_num = show_page_num
        self.page_tags_html = ''
        self.page_start_num = 0
        self.page_end_num = 0
        self.start_page_num = 1
        self.end_page_num = 1
        try:
            self.page_num = int(self.page_num)
        except:
            self.page_num = 1
        # 通过向上取整计算出数据的总页数
        self.total_page_num = math.ceil(self.total_num / self.every_page_num)
        if self.total_page_num:
            # 判断从前端得到的页码数是否小于1,小于1就重置为1
            if self.page_num < 1:
                self.page_num = 1
            # 判断从前端得到的页码数是否大于总页码数,大于就重置为最大页码数
            elif self.page_num > self.total_page_num:
                self.page_num = self.total_page_num
            # 当前页的开始数据
            self.page_start_num = (self.page_num - 1) * self.every_page_num
            # 当前页的结束数据
            self.page_end_num = (self.page_num) * self.every_page_num
            # 判断总页码数和要展示的页数,如果总页码数大于要展示的页码数就展示对应的页数否则有多少页就展示多少页
            if self.total_page_num > self.show_page_num:
                self.start_page_num = self.page_num - (self.show_page_num // 2)
                self.end_page_num = self.page_num + (self.show_page_num // 2)
                if self.start_page_num < 1:
                    self.start_page_num = 1
                    self.end_page_num = self.show_page_num
                if self.end_page_num > self.total_page_num:
                    self.end_page_num = self.total_page_num
                    self.start_page_num = (self.total_page_num - self.show_page_num)
            else:
                self.start_page_num = 1
                self.end_page_num = self.total_page_num

    @property
    def start(self):
        return self.page_start_num

    @property
    def end(self):
        return self.page_end_num

    @property
    def html(self):
        pre_page_num = self.page_num - 1 if self.page_num > 1 else self.page_num
        next_page_num = self.page_num + 1 if self.page_num < self.total_page_num else self.total_page_num
        The_first_page = '<li><a href="?page=1">首页</a>' \
                         f'</li><li><a href="?page={pre_page_num}">&laquo;</a></li>'
        The_last_page = f'<li><a href="?page={next_page_num}">&raquo;</a></li>' \
                        f'<li><a href="?page={self.total_page_num}">尾页</a></li></ul></nav>'

        self.page_tags_html = f'<nav aria-label="Page navigation"> <ul class="pagination">{The_first_page}'
        for i in range(self.start_page_num, self.end_page_num + 1):
            if i == self.page_num:
                self.page_tags_html += f'<li class="active"><a href="?page={i}">{i}</a></li>'
            else:
                self.page_tags_html += f'<li><a href="?page={i}">{i}</a></li>'
        self.page_tags_html += The_last_page
        return self.page_tags_html

高级版(增加了url参数的保留功能)

import math
import copy

class Page:
    def __init__(self, total_num, page_num, request, every_page_num=10, show_page_num=9):
        """
        :param total_num: 数据库获取到的数据的总数
        :param request: 当前url请求数据,用于获取url参数
        :param page_num: 前端获取的页数
        :param every_page_num: 自定义每页显示条数
        :param show_page_num: 显示分页数目
        """
        self.total_num = total_num
        self.page_num = page_num
        self.every_page_num = every_page_num
        self.show_page_num = show_page_num
        self.page_tags_html = ''
        self.page_start_num = 0
        self.page_end_num = 0
        self.start_page_num = 1
        self.end_page_num = 1

        try:
            self.page_num = int(self.page_num)
        except:
            self.page_num = 1

        # 获取当前url请求中的参数
        params = copy.deepcopy(request.GET)
        self.params = params
        # 通过向上取整计算出数据的总页数
        self.total_page_num = math.ceil(self.total_num / self.every_page_num)
        if self.total_page_num:
            # 判断从前端得到的页码数是否小于1,小于1就重置为1
            if self.page_num < 1:
                self.page_num = 1
            # 判断从前端得到的页码数是否大于总页码数,大于就重置为最大页码数
            elif self.page_num > self.total_page_num:
                self.page_num = self.total_page_num
            # 当前页的开始数据
            self.page_start_num = (self.page_num - 1) * self.every_page_num
            # 当前页的结束数据
            self.page_end_num = (self.page_num) * self.every_page_num
            # 判断总页码数和要展示的页数,如果总页码数大于要展示的页码数就展示对应的页数否则有多少页就展示多少页
            if self.total_page_num > self.show_page_num:
                self.start_page_num = self.page_num - (self.show_page_num // 2)
                self.end_page_num = self.page_num + (self.show_page_num // 2)
                if self.start_page_num < 1:
                    self.start_page_num = 1
                    self.end_page_num = self.show_page_num
                if self.end_page_num > self.total_page_num:
                    self.end_page_num = self.total_page_num
                    self.start_page_num = (self.total_page_num - self.show_page_num)
            else:
                self.start_page_num = 1
                self.end_page_num = self.total_page_num

    @property
    def start(self):
        return self.page_start_num

    @property
    def end(self):
        return self.page_end_num

    @property
    def html(self):

        pre_page_num = self.page_num - 1 if self.page_num > 1 else self.page_num
        next_page_num = self.page_num + 1 if self.page_num < self.total_page_num else self.total_page_num
        self.params["page"] = 1
        The_home_page_html = f'<li><a href="?{self.params.urlencode()}">首页</a></li>'
        self.params["page"] = pre_page_num
        pre_page_num_html = f'<li><a href="?{self.params.urlencode()}">&laquo;</a></li>'
        The_first_page_html = The_home_page_html + pre_page_num_html
        self.params["page"] = next_page_num
        next_page_num_html = f'<li><a href="?{self.params.urlencode()}">&raquo;</a></li>'
        self.params["page"] = self.total_page_num
        The_end_page_html = f'<li><a href="?{self.params.urlencode()}">尾页</a></li></ul></nav>'
        The_last_page_html = next_page_num_html + The_end_page_html
        self.page_tags_html = f'<nav aria-label="Page navigation"> <ul class="pagination">{The_first_page_html}'
        for i in range(self.start_page_num, self.end_page_num + 1):
            self.params["page"] = i
            if i == self.page_num:
                self.page_tags_html += f'<li class="active"><a href="?{self.params.urlencode()}">{i}</a></li>'
            else:
                self.page_tags_html += f'<li><a href="?{self.params.urlencode()}">{i}</a></li>'
        self.page_tags_html += The_last_page_html

        return self.page_tags_html

分页的使用:

class Home(views.View):
    def get(self, request):
        article_list = models.Article.objects.all()
        total_num = article_list.count()
        page_num = request.GET.get("page", 1)
        # 分页实例化传参
        page_obj = Page(total_num=total_num, page_num=page_num, every_page_num=9)
        # 根据分页拿到的start和end切片得到所要的数据
        data = article_list[page_obj.start:page_obj.end]
        # 调用html方法得到分页的html代码片段
        page_html = page_obj.html
        return render(request, 'home.html', {'article_list': data, 'page_html': page_html})

ps:在python脚本中调用django环境实现数据库批量添加数据操作

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fenye.settings")

if __name__ == "__main__":
    import django
    django.setup()
    from app01 import models


    def create():
        obj_list = [models.Book(name = f"pyhton{i}") for i in range(160)]
        models.Book.objects.bulk_create(obj_list)

    create()
    #
    # def delete():
    #     models.Book.objects.all().delete()

    # delete()

相关文章

  • (14)Django - 分页功能

    Django已为开发者内置了分页功能,只需调用Django内置分页功能的函数即可实现数据分页功能。我们在Djang...

  • 十二、MyBatis实现分页功能

    一、本课目标 掌握MyBatis分页实现 二、MyBatis分页功能实现 需求说明: 为用户管理之查询用户列表功能...

  • flask实现分页

    原文地址数据库实现分页offset:使用offset可以实现数据库分页功能questions = Question...

  • MyBatis分页和动态标签

    MyBatis分页 内存分页 MyBatis提供了RowBounds类实现内存分页功能。其原理是首先根据sql语句...

  • 分页功能的实现

    直接上代码吧: 基础版 高级版(增加了url参数的保留功能) 分页的使用: ps:在python脚本中调用djan...

  • Springboot+Mybatis+mysql实现分页查询

    分页功能是一个很常见的功能点,今天用PageHelper实现了简单的分页查询功能,记录下使用过程,供而大家参考. ...

  • Pagehelper分页插件的使用

    概述: Pagehelper:是中国的开源的mybatis分页插件,通过该插件可以非常简单的实现分页功能; ...

  • 如何优雅地实现分页查询

    分页功能是很常见的功能,特别是当数据量越来越大的时候,分页查询是必不可少的。实现分页功能有很多种方式,如果使用的O...

  • AngularJs 指令和过滤器实现分页

    这里实际上实现的不是分页,不过跟分页功能比较类似了。这里实现的功能是 限制每一列显示商品的数量,这一列显示不下的 ...

  • 分页组件的简单实现(初稿)

    分页功能是后台管理系统中很常见的一个功能,今天我们就来看下如何实现一个简单的分页组件。 初步实现 首先从最简单的情...

网友评论

      本文标题:分页功能的实现

      本文链接:https://www.haomeiwen.com/subject/weriiftx.html