django高级应用(分页功能)

1、原生分页应用

前端html代码

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for item in posts.object_list %}
<li>{{ item.name }}- {{ item.age }}</li>
{% endfor %}
</ul>
{% include 'include/pages.html' %}
</body>
</html> #include/pages.html {% if posts.has_previous %}
<a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
<a href="#">上一页</a>
{% endif %} {% if posts.has_next %}
<a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
{% endif %}
<span>
{{ posts.number }}/{{ posts.paginator.num_pages }}
</span>

前端html代码

django后台代码

 from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger USER_LIST = []
for i in range(, ):
temp = {'name': 'root' + str(i), 'age': i}
USER_LIST.append(temp) def index1(request):
# 全部数据:USER_LIST,=》得出共有多少条数据
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (,),(,)
# page: page对象(是否具有下一页;是否有上一页;)
current_page = request.GET.get('p')
# Paginator对象
paginator = Paginator(USER_LIST, )
#paginator = CustemPaginator(current_page, , USER_LIST, )
try:
posts = paginator.page(current_page)
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表,已经切片好的数据
# number 当前页
# paginator paginator对象
except PageNotAnInteger:
posts = paginator.page()
except EmptyPage:
posts = paginator.page(paginator.num_pages)
return render(request, "index1.html", {"posts": posts}) django后台代码

django后台代码

缺点:功能少,例如显示页面范围等。

2、自定制添加显示页面范围的功能

 {% if posts.has_previous %}
<a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
<a href="#">上一页</a>
{% endif %} {% for i in posts.paginator.page_num_range %}
{% if i == posts.number %}
<a style="font-size: 20px" href="/index1.html?p={{ i }}">{{ i }}</a>
{% else %}
<a href="/index1.html?p={{ i }}">{{ i }}</a>
{% endif %}
{% endfor %} {% if posts.has_next %}
<a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
{% endif %}
<span>
{{ posts.number }}/{{ posts.paginator.num_pages }}
</span>

前端html代码

django后台代码

 from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger USER_LIST = []
for i in range(, ):
temp = {'name': 'root' + str(i), 'age': i}
USER_LIST.append(temp) class CustemPaginator(Paginator):
"""
是自定制django分页类的方法
:page_num_range 显示返回页数范围
:current_page 当前页数
:max_page_num 最大显示的页码数
"""
def __init__(self, current_page, max_pager_num, *args, **kwargs):
# 当前页
self.current_page = int(current_page)
# 最多显示的页码数量
self.max_pager_num = int(max_pager_num)
super(CustemPaginator,self).__init__(*args, **kwargs) def page_num_range(self):
# 当前页
# self.current_page
# 最多显示的页码数量
# self.per_pager_num
# 总页数
# self.num_pages # 判断如果页面总数量小于显示页面的总数量,那么返回最大的页面总数量。
if self.num_pages < self.max_pager_num:
return range(, self.num_pages + )
part = int(self.max_pager_num / ) # 判断当前页小于等于最大显示页的一半,那么返回1到最大显示页数量。
if self.current_page <= part:
return range(, self.max_pager_num + ) # 当选择页数加上显示页数的一半的时候,说明越界了,例如最大也数是15,显示页数是10,我选择11页,那么11+5等于16,大于15,那么就显示总页数15-+,+
if (self.current_page + part) > self.num_pages:
# 那么返回总页数前去当前显示页数个数+1的值,和总页数+1的值。
return range(self.num_pages - self.max_pager_num + , self.num_pages + ) # 当选择页大于当前总页数的一半的时候,返回当前选择页的前五个和后五个页数。
return range(self.current_page - part, self.current_page + part + ) def index1(request):
# 全部数据:USER_LIST,=》得出共有多少条数据
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (,),(,)
# page: page对象(是否具有下一页;是否有上一页;)
current_page = request.GET.get('p')
# Paginator对象
# paginator = Paginator(USER_LIST, )
paginator = CustemPaginator(current_page, , USER_LIST, )
try:
posts = paginator.page(current_page)
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表,已经切片好的数据
# number 当前页
# paginator paginator对象
except PageNotAnInteger:
posts = paginator.page()
except EmptyPage:
posts = paginator.page(paginator.num_pages)
return render(request, "index1.html", {"posts": posts})

django后台代码

3、自定制分页模块

 # -*- coding: utf- -*-
# @Time : //
# @Author : Ocean.Pan class Pagination(object):
def __init__(self,current_page,total_page_count,per_page_item_num=,max_page_num=,page_url=None):
# 当前页
self.current_page = current_page
try:
v = int(current_page)
if v <= :
v =
self.current_page = v
except Exception as e:
self.current_page =
# 数据总个数
self.total_page_count = total_page_count
# 每一页显示的页面元素个数
self.per_page_item_num = per_page_item_num
# 最大显示页码
self.max_page_num = max_page_num
self.page_url = page_url def start_page_item(self):
'''
开始显示的页面元素,即从第几个页面链接开始显示
:return: 当前页减一乘以每个页面最多显示元素个数
'''
return (self.current_page-) * self.per_page_item_num def end_page_item(self):
'''
结束显示的页面元素,即最后一个页面元素的显示
:return: 当前页乘以每个页面显示的最大元素个数
'''
return self.current_page * self.per_page_item_num # @property 是让num_pages变成以静态属性方式访问。
@property
def num_pages(self):
'''
总页码数量
:return: 当b为零的时候代表是可整除的,a就是返回值,当不能整除时a+1返回。
'''
a,b = divmod(self.total_page_count,self.per_page_item_num)
if b == :
return a
return a+ def page_num_range(self):
'''
页码的显示范围
:return:
''' # 判断如果页面总数量小于显示页面的总数量,那么返回最大的页面总数量。
if self.num_pages < self.max_page_num:
return range(, self.max_page_num + )
part = int(self.max_page_num / ) # 判断当前页小于等于最大显示页的一半,那么返回1到最大显示页数量。
if self.current_page <= part:
return range(, self.max_page_num + ) # 当选择页数加上显示页数的一半的时候,说明越界了,例如最大也数是15,显示页数是10,我选择11页,那么11+5等于16,大于15,那么就显示总页数15-+,+
if (self.current_page + part) > self.num_pages:
# 那么返回总页数前去当前显示页数个数+1的值,和总页数+1的值。
return range(self.num_pages - self.max_page_num + , self.num_pages + ) # 当选择页大于当前总页数的一半的时候,返回当前选择页的前五个和后五个页数。
return range(self.current_page - part, self.current_page + part + ) def page_str(self):
page_list=[]
first = "<li><a href='/%s?p=1'>首页</a></li>" % (self.page_url,)
page_list.append(first) if self.current_page == :
prev = "<li><a href='#'>上一页</a></li>"
else:
prev = "<li><a href='/%s?p=%s'>上一页</a></li>" % (self.page_url,self.current_page - )
page_list.append(prev) for i in self.page_num_range():
if i == self.current_page:
temp = "<li class='active'><a href='/%s?p=%s'>%s</a></li>" %(self.page_url,i,i)
else:
temp = "<li><a href='/%s?p=%s'>%s</a></li>" % (self.page_url,i, i)
page_list.append(temp) if self.current_page == self.num_pages:
nex = "<li><a href='#'>下一页</a></li>"
else:
nex = "<li><a href='/%s?p=%s'>下一页</a></li>" % (self.page_url,self.current_page + )
page_list.append(nex) last = "<li><a href='/%s?p=%s'>尾页</a></li>" %(self.page_url,self.num_pages)
page_list.append(last) return ''.join(page_list)

分页模块后端代码

 from app01.paging import Pagination

 USER_LIST = []
for i in range(, ):
temp = {'name': 'root' + str(i), 'age': i}
USER_LIST.append(temp) def index2(request):
current_page = request.GET.get('p')
page_obj = Pagination(current_page,,page_url="index2.html")
data_list = USER_LIST[page_obj.start_page_item():page_obj.end_page_item()]
return render(request,"index2.html",{"data":data_list,"page_obj":page_obj})

分页模块视图部分

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css"/>
</head>
<body>
<ul>
{% for item in data %}
<li>{{ item.name }}- {{ item.age }}</li>
{% endfor %}
</ul>
<ul class="pagination pagination-sm">
{{ page_obj.page_str|safe }}
</ul>
</body>
</html>

前端展示

django高级应用(分页功能)的更多相关文章

  1. Django实现简单分页功能

    使用django的第三方模块django-pure-pagination 安装模块: pip install django-pure-pagination 将'pure_pagination'添加到s ...

  2. Django自定制分页功能

    URL: """django_paginner URL Configuration The `urlpatterns` list routes URLs to views ...

  3. 利用rest-framework实现django应用的分页功能

    自定义分页的类,继承 PageNumberPagination class StandardResultsSetPagination(PageNumberPagination): page_size ...

  4. Django 之 Paginator 分页功能

    Django Paginator Django 分页官方文档  https://docs.djangoproject.com/en/1.10/topics/pagination/ 此分页方法没有限制显 ...

  5. 【原】django实现列表分页功能

    在view.py里添加分页查询方法: from django.http import JsonResponse from django.views.decorators.http import req ...

  6. Django,ajax实现表格增删查改,Django内置分页功能。

    1.工程目录 2.urls.py """Django_ajax URL Configuration The `urlpatterns` list routes URLs ...

  7. django网页的分页功能,大家如果有疑问请留言

    url文件 from django.contrib import admin from django.conf.urls import url from app01 import views urlp ...

  8. django内置分页功能扩展

    实现自定制页码数类型class myPaginator(Paginator): def __init__(self,curr_page,per_page_num,*args,**kwargs): se ...

  9. django中如何实现分页功能

    1.在html页面中导入js文件和css文件 <link rel="stylesheet" href="../../../static/css/jquery.pag ...

  10. django之快速分页

    本文介绍djanog两种分页,第一是普通分页,第二是使用haystack全文检索的分页. 1.django自带分页功能,这个功能非常好用.基本知识点:Django提供了数据分页的类,这些类被定义在dj ...

随机推荐

  1. prompt() 方法

    定义和用法 prompt() 方法用于显示可提示用户进行输入的对话框. 语法 prompt(text,defaultText) 参数 描述 text 可选.要在对话框中显示的纯文本(而不是 HTML ...

  2. 一定要使用-server参数来调试并发程序

    在阅读JCIP的时候想手工测试一下,结果发现总是没有出现书中描述的并发问题 后来我琢磨,以前记得书上说过,在debugging的环境下,JVM是低并发的,一定要在server的环境下测试,让JVM在高 ...

  3. PowerPoint 2010 设置演讲者模式

  4. STM32CubeMX使用方法及功能介绍

    推荐 分享一个朋友的人工智能教程,零基础!通俗易懂!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前面 学习本文之前可以查 ...

  5. NAT--Network Address Translator

    定义 Nat用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术.除了转换IP地址外,还出现了可以转换TCP.UDP端口号的NAPT(Network Address Ports Tr ...

  6. SDRAM基础

    一. 介绍 存储器的最初结构为线性,它在任何时刻,地址线中都只能有一位有效.设容量为N×M的存储器有S0-Sn-1条地址线:当容量增大时,地址选择线的条数也要线性增多,利用地址译码虽然可有效地减少地址 ...

  7. (转)maven3.3.9编译oozie4.3.0

    1.Java版本1.8 [root@sht-sgmhadoopdn-04 app]# java -versionjava version "1.8.0_66"Java(TM) SE ...

  8. Linux环境PHP7.0.2安装

    PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM.HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂 ...

  9. JS侦测设备旋转方向

    window.onload = window.onresize = function initialLoad(){updateOrientation();} function updateOrient ...

  10. JAVA在语言级支持多线程

    进程:任务 任务并发执行是一个宏观概念,微观上是串行的. 进程的调度是有OS负责的(有的系统为独占式,有的系统为共享式,根据重要性,进程有优先级). 由OS将时间分为若干个时间片. JAVA在语言级支 ...