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) ...
随机推荐
- 非域客户端的office使用RMS加密服务出现‘介绍“信息权限管理服务”’服务的提示
环境:office2007,需要使用windows RMS服务,客户机处于工作组模式,如图: 出现这个说明客户机没有发现RMS服务,可以通过导入注册表解决,如下: Windows Registry E ...
- yii2权限控制rbac之rule详细讲解
作者:白狼 出处:http://www.manks.top/yii2_rbac_rule.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...
- currentStyle与getComputedStyle应用
getComputedStyle获取的是计算机(浏览器)计算后的样式,但是不兼容IE6.7.8(主要用于非IE浏览器) currentStyle方法兼容IE6.7.8,但是不兼容标准浏览器(主要用于I ...
- CSS3:RGBA的使用方法
1.说明 此色彩模式与RGB相同,只是在RGB模式上新增了Alpha透明度. RGBA(R,G,B,A) 2.取值 R: 红色值,正整数值的取值范围为:0 - 255,百分数值的取值范围为:0.0% ...
- loadrunner性能测试---添加windows多台压力机
添加多台压力机 1.前置条件 1)保证压力机上都安装了loadrunner Agent,并启动,状态栏中会有小卫星. 2)添加的压力机与controller所在机器是否在同一个网段,建议关 ...
- 安装wampserver时提示丢失MSVCR110.dll(在windows server上可用)
对于32位系统,安装Wampserver 后启动的时候提示系统错误:MSVCR110.dll丢失. 于是卸载原来的WAMPSERVER .安装vcredist_x86.exe,重新安装WAMPSERV ...
- web安全相关知识
xss攻击入门 XSS攻击及防御 XSS的原理分析与解剖 浅谈CSRF攻击方式 利用HTTP-only Cookie缓解XSS之痛 SERVLET 2.5为COOKIE配置HTTPONLY属性 coo ...
- CANopen学习——PDO
查找资料时,发现一个很好的博客,博主剖析的通俗易懂 http://www.cnblogs.com/winshton/p/4897556.html PDO定义: 过程数据对象,用来传输实时数据.因为 ...
- 【repost】js 常见错误类型
1)SyntaxError SyntaxError是解析代码时发生的语法错误 // 变量名错误 var 1a; // 缺少括号 console.log 'hello'); (2)Referenc ...
- Warning: strftime(): It is not safe to rely on the system's timezone settings.
当运行程序时,会出现如下警告: Warning: strftime(): It is not safe to rely on the system's timezone settings. You a ...