2 django系列之django分页与templatetags
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="#">«</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="#">»</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. Django系列之Django与ajax上传文件
html代码如下: <div class="form-group"> <label for="exampleInputFile">附件上 ...
- python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制
django Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...
- Django 系列博客(八)
Django 系列博客(八) 前言 本篇博客介绍 Django 中的模板层,模板都是Django 使用相关函数渲染后传输给前端在显式的,为了想要渲染出我们想要的数据,需要学习模板语法,相关过滤器.标签 ...
- 通过 Django Pagination 实现简单分页
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 当博客上发布的文章越来越多时,通常需要进行分页显示,以免所有的文章都堆积在一个页面, ...
- Django系列目录
一:搭建自己的博客系列 搭建自己的博客(一):前期准备 搭建自己的博客(二):创建表,创建超级用户 搭建自己的博客(三):简单搭建首页和详情页 搭建自己的博客(四):优化首页和详情页 搭建自己的 ...
- Django 系列博客(十六)
Django 系列博客(十六) 前言 本篇博客介绍 Django 的 forms 组件. 基本属性介绍 创建 forms 类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成 h ...
- Django 系列博客(十四)
Django 系列博客(十四) 前言 本篇博客介绍在 html 中使用 ajax 与后台进行数据交互. 什么是 ajax ajax(Asynchronous Javascript And XML)翻译 ...
- Django 系列博客(十三)
Django 系列博客(十三) 前言 本篇博客介绍 Django 中的常用字段和参数. ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True.当 model ...
- Django 系列博客(十二)
Django 系列博客(十二) 前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询. 聚合查询 语法:aggregate(*args, **kwargs) ...
随机推荐
- arcgis api for js共享干货系列之二自定义Navigation控件样式风格
arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...
- 我的屌丝giser成长记-研二篇
之前有提到过的,本来按照计划中,研一结束就该去深圳中科院研究所实习的,之前跟里面师兄说好了的,奈何导师又接到一个新的科研研究项目,跟学院的几个其他老师一起合作的,主要是关于土地流转系统,而且是一个挺大 ...
- 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?
为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...
- mvc mvp mvvm模式的区别
mvc模式中,Model不依赖于View,但是View是依赖于Model的,m和v没有进行完全的分离,三者之间是单向的操作 mvp模式中,m和v之间的交互是双向的,m和v完全分离,m和v的交互是通过P ...
- IOS之Objective-C学习 代理设计模式
鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式. 代理,又称委托,delegation. 代理模式可以让一个单继承的类实现父类以外其他类的方法. ...
- JQuery plugin ---- simplePagination.js API
CSS Themes "light-theme" "dark-theme" "compact-theme" How To Use Step ...
- 简历生成平台项目开发-STEP2问卷调查结果统计分析
根据之前设计的调查问卷,截止目前为止,一共收到64份问卷结果.一共16题,分别从基本信息.是否对简历制作有需要.对产品期望的特点和建议采纳四个方面设计问题.下面逐题分析问卷结果: 1.您的性别 可以看 ...
- putty提供的两个文件传输工具PSCP、PSFTP详细介绍
用 SSH 来传输文件 PuTTY 提供了两个文件传输工具 PSCP (PuTTY Secure Copy client) PSFTP (PuTTY SFTP client) PSCP 通过 SSH ...
- codegate-quals-2013-vuln100
最近想多看看题目积累些经验, -------- 程序分析 64位,保护措施都没开 gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX ...
- WPF DevExpress 设置雷达图Radar样式
DevExpress中定义的ChartControl很不错,很多项目直接使用这种控件. 本节讲述雷达图的样式设置 <Grid> <Grid.Resources> <D ...