Django怎么实现翻页
发表于:2025-02-24 作者:千家信息网编辑
千家信息网最后更新 2025年02月24日,这篇文章将为大家详细讲解有关Django怎么实现翻页,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、views模块导入Paginator类实现数据分页ApiTes
千家信息网最后更新 2025年02月24日Django怎么实现翻页一、views模块导入Paginator类实现数据分页
二、将views的数据渲染到前端模板上
三、效果展示
四、Paginator类源码
五、Page类源码
这篇文章将为大家详细讲解有关Django怎么实现翻页,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一、views模块导入Paginator类实现数据分页
ApiTest/apiviews.py
每行都加了注释,希望有助于理解。
from django.shortcuts import renderfrom ApiTest.models import ApiTestfrom django.contrib.auth.decorators import login_requiredfrom django.core.paginator import Paginator, EmptyPage, PageNotAnInteger, InvalidPage@login_requireddef api_test_manage(request): username = request.session.get('user', '') # 获取所有接口测试数据 apitest_list = ApiTest.objects.all().order_by('id') # 生成Paginator对象对数据分页,每页显示10条数据 paginator = Paginator(apitest_list,10) # 使用request.GET.get()函数获取url中的page参数的数值。默认第1页 page = request.GET.get('page', 1) # 把获取的当前页码数转换成整数类型 current_page = int(page) try: # 获取查询页数的接口数据列表,page()函数会判断page实参是否是有效数字。page()函数源码附在文章的最后 apitest_list = paginator.page(page) except PageNotAnInteger: apitest_list = paginator.page(1) except (EmptyPage, InvalidPage): # paginator.num_pages apitest_list = paginator.page(paginator.num_pages) return render(request, "apitest_manage.html", {'user': username, 'apitests': apitest_list})
二、将views的数据渲染到前端模板上
在对应的html文件中加入此段代码即可。
{# 上一页链接 #} {% if apitests.has_previous %} - 上一页
{% else %} - 上一页
{% endif %} {# 中间数字显示 #} {% for num in apitests.paginator.page_range %} {% if num == currentPage %} - {{ num }}
{% else %} - {{ num }}
{% endif %} {% endfor %} {# 下一页链接 #} {% if apitests.has_next %} {# 如果有下一页,则正常显示下一页链接 #} - 下一页
{% else %} - 下一页
{% endif %}
三、效果展示
四、Paginator类源码
此类主要用在views文件
class Paginator: def __init__(self, object_list, per_page, orphans=0, allow_empty_first_page=True): self.object_list = object_list self._check_object_list_is_ordered() self.per_page = int(per_page) self.orphans = int(orphans) self.allow_empty_first_page = allow_empty_first_page def validate_number(self, number): """Validate the given 1-based page number.""" try: if isinstance(number, float) and not number.is_integer(): raise ValueError number = int(number) except (TypeError, ValueError): raise PageNotAnInteger(_('That page number is not an integer')) if number < 1: raise EmptyPage(_('That page number is less than 1')) if number > self.num_pages: if number == 1 and self.allow_empty_first_page: pass else: raise EmptyPage(_('That page contains no results')) return number def get_page(self, number): """ Return a valid page, even if the page argument isn't a number or isn't in range. """ try: number = self.validate_number(number) except PageNotAnInteger: number = 1 except EmptyPage: number = self.num_pages return self.page(number) def page(self, number): """Return a Page object for the given 1-based page number.""" number = self.validate_number(number) bottom = (number - 1) * self.per_page top = bottom + self.per_page if top + self.orphans >= self.count: top = self.count return self._get_page(self.object_list[bottom:top], number, self) def _get_page(self, *args, **kwargs): """ Return an instance of a single page. This hook can be used by subclasses to use an alternative to the standard :cls:`Page` object. """ return Page(*args, **kwargs) @cached_property def count(self): """Return the total number of objects, across all pages.""" c = getattr(self.object_list, 'count', None) if callable(c) and not inspect.isbuiltin(c) and method_has_no_args(c): return c() return len(self.object_list) @cached_property def num_pages(self): """Return the total number of pages.""" if self.count == 0 and not self.allow_empty_first_page: return 0 hits = max(1, self.count - self.orphans) return ceil(hits / self.per_page) @property def page_range(self): """ Return a 1-based range of pages for iterating through within a template for loop. """ return range(1, self.num_pages + 1) def _check_object_list_is_ordered(self): """ Warn if self.object_list is unordered (typically a QuerySet). """ ordered = getattr(self.object_list, 'ordered', None) if ordered is not None and not ordered: obj_list_repr = ( '{} {}'.format(self.object_list.model, self.object_list.__class__.__name__) if hasattr(self.object_list, 'model') else '{!r}'.format(self.object_list) ) warnings.warn( 'Pagination may yield inconsistent results with an unordered ' 'object_list: {}.'.format(obj_list_repr), UnorderedObjectListWarning, stacklevel=3 )
五、Page类源码
此类主要用在html文件
class Page(collections.abc.Sequence): def __init__(self, object_list, number, paginator): self.object_list = object_list self.number = number self.paginator = paginator def __repr__(self): return '' % (self.number, self.paginator.num_pages) def __len__(self): return len(self.object_list) def __getitem__(self, index): if not isinstance(index, (int, slice)): raise TypeError( 'Page indices must be integers or slices, not %s.' % type(index).__name__ ) # The object_list is converted to a list so that if it was a QuerySet # it won't be a database hit per __getitem__. if not isinstance(self.object_list, list): self.object_list = list(self.object_list) return self.object_list[index] def has_next(self): return self.number < self.paginator.num_pages def has_previous(self): return self.number > 1 def has_other_pages(self): return self.has_previous() or self.has_next() def next_page_number(self): return self.paginator.validate_number(self.number + 1) def previous_page_number(self): return self.paginator.validate_number(self.number - 1) def start_index(self): """ Return the 1-based index of the first object on this page, relative to total objects in the paginator. """ # Special case, return zero if no items. if self.paginator.count == 0: return 0 return (self.paginator.per_page * (self.number - 1)) + 1 def end_index(self): """ Return the 1-based index of the last object on this page, relative to total objects found (hits). """ # Special case for the last page because there can be orphans. if self.number == self.paginator.num_pages: return self.paginator.count return self.number * self.paginator.per_page
关于"Django怎么实现翻页"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
数据
函数
文件
源码
篇文章
链接
上一
接口
数字
文章
更多
不错
实用
有效
代码
内容
前端
参数
对象
效果
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
金山文档 数据库
初级信息处理技术员数据库操作题
乡镇政府网络安全应急方案
数据库索引创建b树索引
演软件开发的电视剧
哪家服务器的噪音小
软件开发项目量级
软件开发工程师证书入学积分
企业网络安全的系统
服务器mem
数据库原理课程总结报告
第四节网络安全知识竞赛
多表连接关联数据库表
国家电力网络安全
网络安全研究基地上市公司
我的世界服务器攻略
数据库二元联系可分为
网络技术计算机三级题型
是新增数据库字段还是先发布代码
高斯数据库表重命名
华为服务器引导
国家网络安全技术指南
南宁网络技术海信班
a股软件开发名单
怎样管理服务器端口
海淀区互联网软件开发专业服务
黄冈专业的软件开发团队
服务器网络安全组配置
云南没有自己的网络服务器
本地化数据库