Django中如歌自定义分页模块

编程入门 行业动态 更新时间:2024-10-28 20:19:35

Django中如歌自定义<a href=https://www.elefans.com/category/jswz/34/1769545.html style=分页模块"/>

Django中如歌自定义分页模块

阅读目录
当数据库中数据有很多,我们通常会在前端页面做分页展示。

分页的数据可以在前端页面实现,也可以在后端实现分页。

后端实现分页的原理就是每次只请求一页数据。

准备工作

我们使用脚本批量创建一些测试数据(将下面的代码保存到bulk_create.py文件中放到Django项目的根目录,直接执行即可。)

测试数据创建

注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料,感兴趣的+Q群:895 797 751,
--------------------------------------------------------------------import osif __name__ == "__main__":os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")import djangodjango.setup()from app01 import modelsbulk_obj = (models.Publisher(name='沙河第{}出版社'.format(i)) for i in range(300))models.Publisher.objects.bulk_create(bulk_obj)

自定义分页:
手撸版(内部实现原理)

def publisher_list(request):# 从URL中取当前访问的页码数try:current_page = int(request.GET.get('page'))except Exception as e:# 取不到或者页码数不是数字都默认展示第1页current_page = 1# 总数据量total_count = models.Publisher.objects.count()# 定义每页显示多少条数据per_page = 10# 计算出总页码数total_page, more = divmod(total_count, per_page)if more:total_page += 1# 定义页面上最多显示多少页码(为了左右对称,一般设为奇数)max_show = 11half_show = max_show // 2# 计算一下页面显示的页码范围if total_page <= max_show:  # 总页码数小于最大显示页码数page_start = 1page_end = total_pageelif current_page + half_show >= total_page:  # 右边越界page_end = total_pagepage_start = total_page - max_showelif current_page - half_show <= 1:  # 左边越界page_start = 1page_end = max_showelse:  # 正常页码区间page_start = current_page - half_showpage_end = current_page + half_show# 数据索引起始位置data_start = (current_page-1) * per_pagedata_end = current_page * per_pagepublisher_list = models.Publisher.objects.all()[data_start:data_end]# 生成页面上显示的页码page_html_list = []page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">')# 加首页first_li = '<li><a href="/publisher_list/?page=1">首页</a></li>'page_html_list.append(first_li)# 加上一页if current_page == 1:prev_li = '<li><a href="#"><span aria-hidden="true">&laquo;</span></a></li>'else:prev_li = '<li><a href="/publisher_list/?page={}"><span aria-hidden="true">&laquo;</span></a></li>'.format(current_page - 1)page_html_list.append(prev_li)for i in range(page_start, page_end + 1):if i == current_page:li_tag = '<li class="active"><a href="/publisher_list/?page={0}">{0}</a></li>'.format(i)else:li_tag = '<li><a href="/publisher_list/?page={0}">{0}</a></li>'.format(i)page_html_list.append(li_tag)# 加下一页if current_page == total_page:next_li = '<li><a href="#"><span aria-hidden="true">&raquo;</span></a></li>'else:next_li = '<li><a href="/publisher_list/?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format(current_page + 1)page_html_list.append(next_li)# 加尾页page_end_li = '<li><a href="/publisher_list/?page={}">尾页</a></li>'.format(total_page)page_html_list.append(page_end_li)page_html_list.append('</ul></nav>')page_html = "".join(page_html_list)return render(request, "publisher_list.html", {"publisher_list": publisher_list, "page_html": page_html})

模板封装建议使用版

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 += 1self.total_page = total_page# 定义页面上最多显示多少页码(为了左右对称,一般设为奇数)self.max_show = max_showself.half_show = max_show // 2self.base_url = base_url@propertydef start(self):return (self.current_page-1) * self.per_page@propertydef end(self):return self.current_page * self.per_pagedef page_html(self):# 计算一下页面显示的页码范围if self.total_page <= self.max_show:  # 总页码数小于最大显示页码数page_start = 1page_end = self.total_pageelif self.current_page + self.half_show >= self.total_page:  # 右边越界page_end = self.total_pagepage_start = self.total_page - self.max_showelif self.current_page - self.half_show <= 1:  # 左边越界page_start = 1page_end = self.max_showelse:  # 正常页码区间page_start = self.current_page - self.half_showpage_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 publisher_list(request):# 从URL中取当前访问的页码数current_page = int(request.GET.get('page'))# 比len(models.Publisher.objects.all())更高效total_count = models.Publisher.objects.count()page_obj = Pagination(current_page, total_count, request.path_info)data = models.Publisher.objects.all()[page_obj.start:page_obj.end]page_html = page_obj.page_html()return render(request, "publisher_list.html", locals())前端循环显示那:
{% for i in publisher_list %}
....
{% endfor %}{{ page_obj.page_html|safe }}

Django内置分页

Django内置分页view版

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerL = []
for i in range(999):L.append(i)def index(request):current_page = request.GET.get('p')paginator = Paginator(L, 10)# per_page: 每页显示条目数量# count:    数据总个数# num_pages:总页数# page_range:总页数的索引范围,如: (1,10),(1,200)# page:     page对象try:posts = paginator.page(current_page)# has_next              是否有下一页# next_page_number      下一页页码# has_previous          是否有上一页# previous_page_number  上一页页码# object_list           分页之后的数据列表# number                当前页# paginator             paginator对象except PageNotAnInteger:posts = paginator.page(1)except EmptyPage:posts = paginator.page(paginator.num_pages)return render(request, 'index.html', {'posts': posts})

Django内置分页html版

<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title></title>
</head>
<body>
<ul>{% for item in posts %}<li>{{ item }}</li>{% endfor %}
</ul><div class="pagination"><span class="step-links">{% if posts.has_previous %}<a href="?p={{ posts.previous_page_number }}">Previous</a>{% endif %}<span class="current">Page {{ posts.number }} of {{ posts.paginator.num_pages }}.</span>{% if posts.has_next %}<a href="?p={{ posts.next_page_number }}">Next</a>{% endif %}</span></div>
</body>
</html>

更多推荐

Django中如歌自定义分页模块

本文发布于:2023-07-28 22:04:53,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1335293.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:分页   自定义   如歌   模块   Django

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!