preface

当页面出现的条目多的时候,我们就需要使用分页功能了。Django作为一个知名的web框架,自然也提供了分页功能,下面说说它。

Python-shell 练练手

在python下入手

先创建一个操作对象
>>> hehe = ['ljf','richer','wang',1,2,3]
>>> hehe
['ljf', 'richer', 'wang', 1, 2, 3]
表示每页两份,表示把hehe这个列表每一页2份数据
>>> p = Paginator(hehe,2)       #表示每页两份,表示把hehe这个列表每一页2份数据
>>> p
<django.core.paginator.Paginator object at 0x0000000000B75630>
统计多少个值
>>> p.count           #统计多少个值
6
统计多少页
>>> p.num_pages         #统计多少页
3
查看页数
>>> p.page_range     #查看页数
range(1, 4)
取第一页的内容
>>> p1=p.page(1)       #取第一页的内容
>>> p1
>>> p1.object_list
['ljf', 'richer']
获取第二页
>>> p2=p.page(2)
>>> p2
<Page 2 of 3>
显示当前页内容
>>> p2.object_list
['wang', 1]
判断是否有一下页
>>> p2.has_next() #判断是否有一下页
True
判断是否有上一页
>>> p1.has_previous()            # 判断是否有上一页
False
判断是否还有其他页
>>> p1.has_other_pages()          # 判断是否还有其他页
True

在html中使用分页功能

在html中,我们需要使用django 的templatetags功能来实现动态显示当前页的前后3页,避免页数过大导致页码太长。这个功能可以参考官网的例子(https://docs.djangoproject.com/en/1.10/howto/custom-template-tags/)。

我们首先查看项目目录,自己写的tag在app下面新建一个目录templatetags,必须是这个名字:

[root@salt devops]# tree BatchM
BatchM
├── Batch
│   ├── templatetags
│   │   ├── custom_tag.py # 这个就是自己定义的tag.
│   │   ├── __init__.py
custom_tag.py的内容

from django import template from django.utils.html import format_html
register = template.Library() # 注册到tempate库里面 @register.filter # filter只能对一个参数传入有效,调用到时候这样用 {{ xx.line | ljf_power}}
def ljf_lower(val): #这个仅仅是测试练习写的代码,可以忽略。
return val.lower() @register.simple_tag() # simple_tag能够对传入多个参数有效
def guess_page(current_page,loop_num):
''' :param current_page: 当前页
:param loop_num: 页数范围
:return:
''' offset = abs(current_page - loop_num)
if offset < 3: # 表示取当前页的前后三页
if current_page == loop_num :
page_element = '''
<li class="active"><a href="?page=%s">%s<span class="sr-only">(current)</span></a></li>
'''%(loop_num,loop_num) # 拼html代码
else:
page_element = '''
<li><a href="?page=%s">%s<span class="sr-only">(current)</span></a></li>
'''%(loop_num,loop_num)
return format_html(page_element)
else:
return '' # 必须写一个return 空字符串,这样就不会在前端页面显示None
我们再看看调用这个tags的html代码
提前引入bootstrap,jquery。
{% load custom_tag %} # 需要引用刚才创建的tag
''''省略其他代码N行
<nav>
<ul class="pagination">
{% if contacts.has_previous %} <!-- 判断是否有首页 -->
<li class="disabled"><a href="#">&laquo;</a></li>
{% endif %} {% for page_num in contacts.paginator.page_range %}
{% guess_page contacts.number page_num %} <!-- guess_page 直接写刚才在tag里面定义的方法, contacts.numer表示时当前页,page_num表示for循环到元素-->
{% endfor %} {% if contacts.has_next %} <!-- 判断是否有下一页 -->
<li class="disabled"><a href="#">&raquo;</a></li>
{% endif %}
</ul>
</nav>
再看views里面的代码:
def apply_update_search(request):
'''
:param request:
:return:
'''
if request.method == 'GET':
records = models.WorkOrderOfUpdate.objects.filter(username=request.user.get_username()).order_by('OrderId').reverse() #数据库搜索
page = request.GET.get('page') # 与前端页面的a标签链接保持一致
try:
contacts = pageinator.page(page)
except PageNotAnInteger: # 如果输入到不是一个数字,发送第一页
contacts = pageinator.page(1)
except EmptyPage: # 如果获取到超过来页数范围,那么就返回最后一页。
contacts = pageinator.page(pageinator.num_pages)
return render(request,'apply_update.html',{'btitle':'搜索操作记录','contacts':contacts})
url配置
url(r"apply_update.html/search",views.apply_update_search,name='post_order_id')

以上功能完成后,就可以实现这样的功能:

2 django系列之django分页与templatetags的更多相关文章

  1. 1. Django系列之Django与ajax上传文件

    html代码如下: <div class="form-group"> <label for="exampleInputFile">附件上 ...

  2. python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制

    django  Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...

  3. Django 系列博客(八)

    Django 系列博客(八) 前言 本篇博客介绍 Django 中的模板层,模板都是Django 使用相关函数渲染后传输给前端在显式的,为了想要渲染出我们想要的数据,需要学习模板语法,相关过滤器.标签 ...

  4. 通过 Django Pagination 实现简单分页

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 当博客上发布的文章越来越多时,通常需要进行分页显示,以免所有的文章都堆积在一个页面, ...

  5. Django系列目录

    一:搭建自己的博客系列  搭建自己的博客(一):前期准备  搭建自己的博客(二):创建表,创建超级用户  搭建自己的博客(三):简单搭建首页和详情页 搭建自己的博客(四):优化首页和详情页 搭建自己的 ...

  6. Django 系列博客(十六)

    Django 系列博客(十六) 前言 本篇博客介绍 Django 的 forms 组件. 基本属性介绍 创建 forms 类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成 h ...

  7. Django 系列博客(十四)

    Django 系列博客(十四) 前言 本篇博客介绍在 html 中使用 ajax 与后台进行数据交互. 什么是 ajax ajax(Asynchronous Javascript And XML)翻译 ...

  8. Django 系列博客(十三)

    Django 系列博客(十三) 前言 本篇博客介绍 Django 中的常用字段和参数. ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True.当 model ...

  9. Django 系列博客(十二)

    Django 系列博客(十二) 前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询. 聚合查询 语法:aggregate(*args, **kwargs) ...

随机推荐

  1. 移动端web开发——视口

    本篇主要是记录一下移动端视口的分类说明和其它的一些知识.在开始之前,先看一个典型的例子: <meta name="viewport" content="width= ...

  2. SharePoint2016母版页的直接依赖项的数目限制超过10的限制解决方案Direct Dependencies Limit with Master page User Controls

    前言 最近母版制作站点模板,根据站点模板新建后发现如下错误: 解决方案 1. 打开C:\inetpub\wwwroot\wss\VirtualDirectories\,如下图: 2. 打开web.co ...

  3. 用java单例模式实现面板切换

    1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...

  4. HTML学习(二)进阶篇

    在博客园中有许多大神对HTML超文本标记语言写了很多内容,总结了很多知识,这里对我看到的博客文章, 所学到的知识,做一个总结.  一)列表和表格 dl→definition list(定义列表),见备 ...

  5. iOS-集成支付宝支付、微信支付简单总结

    支付宝快捷支付: 官方文档中,支付宝说建议我们使用支付时要讲签名过程放在服务器端,这样安全.同时给的demo中签名是在本地移动端做的...不过支付宝的集成还是较简单的. 为了安全签名当然放后台做了.我 ...

  6. Atitit.android播放smb 网络邻居视频文件解决方案

    Atitit.android播放smb 网络邻居视频文件解决方案 Android4.4 1.1. Android4视频播放器不能直接地支持smb协议..子好先转换成个http流 1.2. ES文件浏览 ...

  7. ASP.NET MVC 3 技术(九) 301永久重定向不带www域名到带www的域名

    在 .net 4 中实现永久重定向非常容易,可以参考ASP.NET MVC3 技术(四) 永久重定向方法.今天主要说明下怎么在 asp.net mvc 3 实现从带www的域名永久重定向到不带www的 ...

  8. 3、项目资源的提供 - PMO项目管理办公室

    PMO项目管理办公室也需要对项目相关的资源进行提供,从而针对项目的资源也进行标准化和规范化的管理.也就是说,PMO项目管理办公室就是提供项目相关的规范化资源内容,从而统一管理项目相关的内容,达到规范的 ...

  9. 3-udev

    Udev 这个是挂载上的u盘 拔掉再插上 查看u盘设备信息 拔掉再插上,显示了 来自为知笔记(Wiz) 附件列表

  10. 使用Servlet和JSP实现一个简单的Web聊天室系统

    1 问题描述                                                利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...