在Python Django框架中,为了提高代码的复用性和可维护性,通常会将一些常用的功能封装成模块。本文主要讲解如何将分页功能封装为一个通用的模块,以便在多个视图或应用中方便地调用。 我们需要创建一个名为`utils`的文件夹,在这个文件夹内创建一个名为`page.py`的Python文件。在这个文件中定义一个名为`ShowPage`的类,这个类将负责处理分页逻辑。以下是`ShowPage`类的详细解释: ```python class ShowPage(object): def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11): # 初始化参数 self.url_prefix = url_prefix # a标签href的前缀 self.max_page = max_page # 页面上最多显示的页码数 self.per_page = per_page # 每页展示的数据数 # 计算总页数 total_page, m = divmod(total_count, per_page) if m: total_page += 1 self.total_page = total_page # 处理非法的页码输入 try: page_num = int(page_num) if page_num > self.total_page: page_num = self.total_page elif page_num < 1: page_num = 1 except Exception as e: page_num = 1 self.page_num = page_num # 计算数据的起始和结束位置 self.data_start = (self.page_num - 1) * per_page self.data_end = self.page_num * per_page # 计算页面上显示的页码范围 if self.total_page < self.max_page: self.max_page = self.total_page half_max_page = self.max_page // 2 page_start = self.page_num - half_max_page page_end = self.page_num + half_max_page if page_start <= 1: page_start = 1 page_end = self.max_page elif page_end >= self.total_page: page_end = self.total_page page_start = self.total_page - self.max_page + 1 self.page_start = page_start self.page_end = page_end @property def start(self): return self.data_start @property def end(self): return self.data_end def page_html(self): # 拼接HTML分页代码 html_list = [] # 添加首页、上一页、下一页、末页的链接 html_list.append('<li><a href="{}?page=1" rel="external nofollow">首页</a></li>'.format(self.url_prefix)) if self.page_num > 1: html_list.append('<li><a href="{}?page={}" rel="external nofollow">上一页</a></li>'.format(self.url_prefix, self.page_num - 1)) for i in range(self.page_start, self.page_end + 1): if i == self.page_num: html_list.append('<li class="active"><span>{}</span></li>'.format(i)) else: html_list.append('<li><a href="{}?page={}" rel="external nofollow">{}</a></li>'.format(self.url_prefix, i, i)) if self.page_num < self.total_page: html_list.append('<li><a href="{}?page={}" rel="external nofollow">下一页</a></li>'.format(self.url_prefix, self.page_num + 1)) html_list.append('<li><a href="{}?page={}" rel="external nofollow">末页</a></li>'.format(self.url_prefix, self.total_page)) # 返回HTML字符串 return ''.join(html_list) ``` `ShowPage`类的初始化方法`__init__`接收五个参数:当前页码`page_num`,数据总数`total_count`,URL前缀`url_prefix`,每页数据量`per_page`(默认为10),以及页面上最多显示的页码数`max_page`(默认为11)。这个类会计算出总页数、数据的起始和结束位置,以及页面上显示的页码范围。 `start`和`end`属性是用@property装饰器定义的,分别返回数据的起始和结束索引,方便在视图中获取对应范围的数据。 `page_html`方法用于生成HTML代码,包含首页、上一页、当前页、下一页和末页的链接。它会根据当前页码和最大显示页码数动态生成相应的分页链接,确保用户能够方便地浏览数据的不同页。 在实际使用中,你可以先计算出总页数和当前页码,然后创建一个`ShowPage`对象,调用其`page_html`方法得到分页HTML,将其插入到模板中。这样,无论在哪个视图或应用中,都可以轻松实现分页功能,提高了代码的复用性。 例如,你可以在视图函数中这样使用: ```python from .utils import ShowPage def some_view(request): # 获取数据和总页数 data = SomeModel.objects.all() total_count = data.count() page_num = request.GET.get('page', 1) # 创建ShowPage对象 pager = ShowPage(page_num, total_count, '/some_url/') # 渲染模板并传递分页HTML return render(request, 'template.html', {'data': data[pager.start:pager.end], 'pager_html': pager.page_html()}) ``` 通过这种方式,Django项目中的分页功能就可以被有效地封装和重用了。这种模块化的编程方式有助于减少代码冗余,提高代码质量,同时便于后期维护和扩展。
- 粉丝: 6
- 资源: 871
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助