首页 > 其他分享 >分页模块逻辑与封装

分页模块逻辑与封装

时间:2024-05-16 15:18:43浏览次数:18  
标签:封装 分页 self li current book 模块 total page

分页模块逻辑与封装

class Pagination(object):
    """自定义分页(Bootstrap版)"""
    def __init__(self, current_page, total_count, base_url, per_page=10, max_show=11):
        """
        :param current_page: 当前请求的页码
        :param total_count: 总数据量
        :param base_url: 请求的URL
        :param per_page: 每页显示的数据量,默认值为10
        :param max_show: 页面上最多显示多少个页码,默认值为11
        """
        try:
            self.current_page = int(current_page)
        except Exception as e:
            # 取不到或者页码数不是数字都默认展示第1页
            self.current_page = 1
        # 定义每页显示多少条数据
        self.per_page = per_page
        # 计算出总页码数
        total_page, more = divmod(total_count, per_page)
        if more:
            total_page += 1
        self.total_page = total_page
        # 定义页面上最多显示多少页码(为了左右对称,一般设为奇数)
        self.max_show = max_show
        self.half_show = max_show // 2
        self.base_url = base_url

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

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

    def page_html(self):
        # 计算一下页面显示的页码范围
        if self.total_page <= self.max_show:  # 总页码数小于最大显示页码数
            page_start = 1
            page_end = self.total_page
        elif self.current_page + self.half_show >= self.total_page:  # 右边越界
            page_end = self.total_page
            page_start = self.total_page - self.max_show
        elif self.current_page - self.half_show <= 1:  # 左边越界
            page_start = 1
            page_end = self.max_show
        else:  # 正常页码区间
            page_start = self.current_page - self.half_show
            page_end = self.current_page + self.half_show
        # 生成页面上显示的页码
        page_html_list = []
        page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">')
        # 加首页
        first_li = '<li><a href="{}?page=1">首页</a></li>'.format(self.base_url)
        page_html_list.append(first_li)
        # 加上一页
        if self.current_page == 1:
            prev_li = '<li><a href="#"><span aria-hidden="true">&laquo;</span></a></li>'
        else:
            prev_li = '<li><a href="{}?page={}"><span aria-hidden="true">&laquo;</span></a></li>'.format(
                self.base_url, self.current_page - 1)
        page_html_list.append(prev_li)
        for i in range(page_start, page_end + 1):
            if i == self.current_page:
                li_tag = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)
            else:
                li_tag = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)
            page_html_list.append(li_tag)
        # 加下一页
        if self.current_page == self.total_page:
            next_li = '<li><a href="#"><span aria-hidden="true">&raquo;</span></a></li>'
        else:
            next_li = '<li><a href="{}?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format(
                self.base_url, self.current_page + 1)
        page_html_list.append(next_li)
        # 加尾页
        page_end_li = '<li><a href="{}?page={}">尾页</a></li>'.format(self.base_url, self.total_page)
        page_html_list.append(page_end_li)
        page_html_list.append('</ul></nav>')
        return "".join(page_html_list)

后端使用

def books(request):
	current_page = request.GET.get('page') # ?page=1
	try:
		current_page = int(current_page)  #没有page参数或者不是数字字符串
	except:
		current_page = 1

	all_book_objs = models.Book.objects.all()
	total_count = all_book_objs.count()  # 总数据量
	page_obj = Pagenation(current_page, total_count)
	book_objs = models.Book.objects.all()[page_obj.page_data_start:page_obj.end_data_start] #获取所需要的数据并展示
	return render(request, 'books.html', {'book_objs': book_objs, 'page_obj': page_obj})

前端调用

    {% for book in book_objs %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ book.title }}</td>
            <td>{{ book.price }}</td>
            <td>{{ book.publishDate|date:'Y-m-d' }}</td>
            <td>{{ book.publishs.name }}</td>
            <td>{{ book.get_authors_name }}</td>
        </tr>
    {% endfor %}

{{ page_obj.page_html }}

标签:封装,分页,self,li,current,book,模块,total,page
From: https://www.cnblogs.com/wbcde116/p/18196026

相关文章

  • BOSHIDA AC/DC电源模块在工业自动化领域的应用探析
    BOSHIDAAC/DC电源模块在工业自动化领域的应用探析AC/DC电源模块是一种将交流电转换为直流电的电力转换设备,在工业自动化领域具有广泛的应用。本文将从稳定性、效率和可靠性三个方面对AC/DC电源模块在工业自动化领域的应用进行探析。 首先,AC/DC电源模块在工业自动化领域的应......
  • django-drf 全局封装
    封装全局异常common_exceptions.pyfromrest_framework.viewsimportexception_handlerfromrest_framework.responseimportResponsedefcommon_exception_handler(exc,context):#记录日志request=context.get('request')view=context.get(�......
  • Selenium4自动化测试8--控件获取数据--上传、下载、https和切换分页
    系列导航一、Selenium4自动化测试1--Chrome浏览器和chromedriver二、Selenium4自动化测试2--元素定位By.ID,By.CLASS_NAME,By.TAG_NAME三、Selenium4自动化测试3--元素定位By.NAME,By.LINK_TEXT和通过链接部分文本定位,By.PARTIAL_LINK_TEXT,css_selector定位,By.CSS_SELECTOR四、j......
  • 排序、过滤、分页
    排序、过滤、分页1.排序1.1使用条件#必须是查询所有接口--》restful规范中:地址栏中带过滤条件 http://127.0.0.1:8008/app01/api/v1/books/?ordering=price#必须是继承GenericAPIView的视图类---》继承APIView是不能这么配置的1.2使用排序#1.引入相关排序相关......
  • 06模块与包回顾
    模块与包回顾#模块 -一个py文件,导入使用,他就是模块-一个py,点右键运行,他叫脚本文件#包 -一个文件夹下有__init__.py,下面又有很多文件夹和py文件,导入使用的#以后只要看到这个报错 ModuleNotFoundError:Nomodulenamed'xx',但是这个模块有......
  • 03请求数据封装request、版本管理
    请求数据封装request、版本管理一、请求数据再封装以前我们通过django开发项目时,视图中的request是django.core.handlers.wsgi.WSGIRequest类的对象,其中包含了请求相关的所有数据。而在使用drf框架时,视图中的request是rest_framework.request.Request类的对象,其是又对dja......
  • BOSHIDA AC/DC电源模块的故障诊断与维修技巧
    BOSHIDAAC/DC电源模块的故障诊断与维修技巧AC/DC电源模块是一种常用的电力转换设备,用于将交流电转换为直流电供给电子设备。然而,由于使用环境和操作不当等原因,电源模块可能会出现故障。本文将介绍AC/DC电源模块的故障诊断与维修技巧。 故障诊断的第一步是检查输入电源。首先......
  • C++封装dll(__cdecl和__stdcall)
    【1】使用__stdcall还需要添加def文件编译,使用工具DEPENDS.EXE打开dll文件成功。【2】使用__cdecl直接编译即可,不需要导入def文件......
  • 中移ML307R模块使用手册
     模块链接:https://item.taobao.com/item.htm?ft=t&id=795927858234实物图  模块信息1.模块型号:  中移ML307R-DL2.频段信息:    LTE-FDDB1/B3/B5/B8(全网通)   LTE-TDDB34/B38/B39/B40/B413.网络协议:    IPv4/IPv6/PING/NTP/DNS/TCP/UDP/HT......
  • 运维自动化新篇章:从业务到拓扑,一键构建集群模块
    业务,是蓝鲸CD体系中比较重要的概念和维度,日常使用中主机、进程、业务拓扑的管理都需要依赖已经存在的业务,其他蓝鲸体系产品也基本上都是围绕业务的维度来提供对应的服务和相关的鉴权。1、创建业务/业务集请确保有创建业务的权限,一般可以由管理员创建或申请创建业务的权限资......