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. arcgis api for js共享干货系列之二自定义Navigation控件样式风格

    arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...

  2. 我的屌丝giser成长记-研二篇

    之前有提到过的,本来按照计划中,研一结束就该去深圳中科院研究所实习的,之前跟里面师兄说好了的,奈何导师又接到一个新的科研研究项目,跟学院的几个其他老师一起合作的,主要是关于土地流转系统,而且是一个挺大 ...

  3. 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?

    为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...

  4. mvc mvp mvvm模式的区别

    mvc模式中,Model不依赖于View,但是View是依赖于Model的,m和v没有进行完全的分离,三者之间是单向的操作 mvp模式中,m和v之间的交互是双向的,m和v完全分离,m和v的交互是通过P ...

  5. IOS之Objective-C学习 代理设计模式

    鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式. 代理,又称委托,delegation. 代理模式可以让一个单继承的类实现父类以外其他类的方法. ...

  6. JQuery plugin ---- simplePagination.js API

    CSS Themes "light-theme" "dark-theme" "compact-theme" How To Use Step ...

  7. 简历生成平台项目开发-STEP2问卷调查结果统计分析

    根据之前设计的调查问卷,截止目前为止,一共收到64份问卷结果.一共16题,分别从基本信息.是否对简历制作有需要.对产品期望的特点和建议采纳四个方面设计问题.下面逐题分析问卷结果: 1.您的性别 可以看 ...

  8. putty提供的两个文件传输工具PSCP、PSFTP详细介绍

    用 SSH 来传输文件 PuTTY 提供了两个文件传输工具 PSCP (PuTTY Secure Copy client) PSFTP (PuTTY SFTP client) PSCP 通过 SSH ...

  9. codegate-quals-2013-vuln100

    最近想多看看题目积累些经验, -------- 程序分析 64位,保护措施都没开 gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX ...

  10. WPF DevExpress 设置雷达图Radar样式

      DevExpress中定义的ChartControl很不错,很多项目直接使用这种控件. 本节讲述雷达图的样式设置 <Grid> <Grid.Resources> <D ...