Django怎么实现翻页
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,这篇文章将为大家详细讲解有关Django怎么实现翻页,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、views模块导入Paginator类实现数据分页ApiTes
千家信息网最后更新 2025年01月17日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安全错误
数据库的锁怎样保障安全
公证处清洁服务器
平潭软件开发工作室
寻甸综合软件开发咨询报价
七日杀服务器网页管理
网络安全采取的措施
涞源怎样软件开发
网络安全问题解决报告
普通服务器改存储服务器
玩托了手游数据库app
软件开发验收方案 百度文库
在线软件开发协议
电脑版微信读取sql数据库
我来数科连接服务器失败
塔里木大学网络安全中心在哪里
大学生网络安全竞赛证书在哪领
靖江工业网络技术是什么
信息系统与数据库技术公共课
医院系统用什么数据库
杭州学软件开发安全
虚拟机上显示服务器没有声音
保苗网络安全课
堡垒机如何从服务器上拷贝文件
网站怎么仿数据库呢
知识库与数据库
河北智能软件开发服务咨询报价
中信银行软件开发规范
永兴软件开发多少钱一个月
微软dhcp服务器日常维护
浅析网络安全技术支持
mysql数据库的缺点