1.准备数据

在models创建测试表

from django.db import models

class Host(models.Model):
hostname = models.CharField(max_length=32)
# ip = models.GenericIPAddressField(protocol='ipv4')
ip = models.CharField(max_length=32)
port = models.IntegerField()

2.自动化生成数据

    hostname = "hostname%s.com"
for i in range(302):
models.Host.objects.create(hostname=hostname %str(i),ip="1.1.1.1",port=8080)
return HttpResponse("...")

3.分页组件

"""
分页组件:
使用方法:
视图函数:
from utils.pager import Pagination
def host(request):
all_count = models.Host.objects.all().count()
# page_obj = Pagination(request.GET.get('page'),all_count,'/host/')
page_obj = Pagination(request.GET.get('page'),all_count,request.path_info)
host_list = models.Host.objects.all()[page_obj.start:page_obj.end]
return render(request,'host.html',{'host_list':host_list,'page_html': page_obj.page_html()})
HTML:
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<style>
.pager .active>a {
z-index: 3;
color: #fff;
cursor: default;
background-color: #337ab7;
border-color: #337ab7;
} .pager li>a:hover {
z-index: 5;
color: #fff;
cursor: default;
background-color: #337ab7;
border-color: #337ab7;
} .pager li>a{
border-radius: 5px;
margin: 0 3px;
padding: 3px 5px;
min-width:40px;
} </style>
""" from django.utils.safestring import mark_safe
class Pagination(object):
def __init__(self,current_page,total_count,base_url, per_page_count=10,max_pager_num=11):
"""
:param current_page: 用户请求的当前页
:param per_page_count: 每页显示的数据条数
:param total_count: 数据库中查询到的数据总条数
:param max_pager_num: 页面上最多显示的页码
"""
self.base_url = base_url
total_page_count, div = divmod(total_count, per_page_count)
if div:
total_page_count += 1 self.total_page_count = total_page_count
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
if current_page > total_page_count:
current_page = total_page_count self.current_page = current_page
self.per_page_count = per_page_count
self.total_count = total_count
self.max_pager_num = max_pager_num
self.half_max_pager_num = int(max_pager_num/2) @property
def start(self):
return (self.current_page - 1) * self.per_page_count @property
def end(self):
return self.current_page * self.per_page_count def page_html(self):
page_html_list = [] page_html_list.append("<ul>")
if self.current_page <= 1:
prev = "<li><a href='#'>上一页</a></li>"
else:
prev = "<li><a href='%s?page=%s'>上一页</a></li>" % (self.base_url,self.current_page - 1,)
page_html_list.append(prev) max_pager_num = 11
half_max_pager_num = int(max_pager_num / 2) # 数据总页数 < 页面上最大显示的页码个数
if self.total_page_count <= max_pager_num:
page_start = 1
page_end = self.total_page_count
else:
# 数据比较多,已经超过11个页码
# 如果当前页 <=5,显示 1-11
if self.current_page <= half_max_pager_num:
page_start = 1
page_end = max_pager_num
else:
# 当前页 >= 6
if (self.current_page + 5) > self.total_page_count:
page_end = self.total_page_count
# page_start = current_page - 5
page_start = self.total_page_count - max_pager_num + 1
else:
page_start = self.current_page - half_max_pager_num # 当前页 - 5
page_end = self.current_page + half_max_pager_num # 当前页 + 5 for i in range(page_start, page_end + 1):
if self.current_page == i:
tag = "<li class='active'><a href='%s?page=%s'>%s</a></li>" % (self.base_url,i, i,)
else:
tag = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url,i, i,)
page_html_list.append(tag) # 下一页
if self.current_page >= self.total_page_count:
nex = "<li><a href='#'>下一页</a></li>"
else:
nex = "<li><a href='%s?page=%s'>下一页</a></li>" % (self.base_url,self.current_page + 1,)
page_html_list.append(nex)
page_html_list.append("</ul>") return mark_safe("".join(page_html_list))

4.页面代码

{% block css %}
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<style>
.pager .active>a {
z-index: 3;
color: #fff;
cursor: default;
background-color: #337ab7;
border-color: #337ab7;
}
.pager li>a:hover {
z-index: 5;
color: #fff;
cursor: default;
background-color: #337ab7;
border-color: #337ab7;
}
.pager li>a{
border-radius: 5px;
margin: 0 3px;
padding: 3px 5px;
min-width:40px;
}
</style>
{% endblock %} {% block body %}
<div class="container">
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>主机名</th>
<th>IP</th>
<th>端口</th>
</tr>
</thead>
<tbody>
{% for row in host_list %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.hostname }}</td>
<td>{{ row.ip }}</td>
<td>{{ row.port }}</td>
</tr>
{% endfor %}
</tbody>
</table> <div class="pager">
{{ page_html}}
</div>
</div> {% endblock %}

5.展示效果

django自定义分页控件的更多相关文章

  1. asp.net webform 自定义分页控件

    做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件. 翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册. 有图有真相,给个直观的认识: 自定义分页控件前台代码: & ...

  2. C# DataGridView自定义分页控件

    好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...

  3. Mvc自定义分页控件

    MVC开发分页常常使用第三方控件,生成的分页HTML带有版权申明,虽然免费,但是总有的别扭.于是,某日,楼主闲来蛋疼,折腾了个自定义分页控件: 先来展示下效果图: 1>当分页不超过10页的时候, ...

  4. WPF自定义分页控件,样式自定义,简单易用

    WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...

  5. Winform自定义分页控件的实现

    实现效果 有点丑陋 但是功能是没问题的 测试过 实现思路 先创建一个用户控件 代码实现 public partial class PagerControl : UserControl { ; /// ...

  6. winform 自定义分页控件 及DataGridview数据绑定

    分页效果如上图所示,用到的控件均为基本控件 ,其方法如下 右击项目-添加-新建项 选择用户控件 然后在用户控件中拖入所需要的Label,Button,Text 用户控件全部代码: using Syst ...

  7. WPF管理系统自定义分页控件 - WPF特工队内部资料

    最近做一个演示的管理系统项目,需要用到分页控件,在网上找了很多,依然找到与UI模版匹配的,最后干脆自己写一个. 分页控件分析: 1.分页控件分简单显示和复杂显示两种: 2.包含上一页.下一页以及页码明 ...

  8. WPF 自定义分页控件二

    一:添加自定义分页控件,命名为KDataPagerTwo: public class KDataPagerTwo : Control, INotifyPropertyChanged { static ...

  9. 自定义分页控件-基于Zhifeiya的分页控件改版

    基于Zhifeiya的分页控件改版的分页. html显示代码: <div class="pagelist"> {{.pagerHtml}} </div> c ...

随机推荐

  1. Django之ModelForm(一)

    要说ModelForm,那就先说Form吧! 先给出一个Form示例: models.py from django.db import models class UserType(models.Mod ...

  2. 给vim安装YouCompleteMe

    要安装YouCompleteMe ,vim须支持python.看是否支持,可以在vim中:version 查看, 如果python前有+号,就是支持,减号就是不支持. 如果不支持,需要以编译安装方式重 ...

  3. Linux CentOS 6.9(图形界面)安装中文输入法

    安装步骤 1. 切换到 root 用户,执行 yum -y install "@Chinese Support" 2. 退出终端,选择桌面菜单中 "System" ...

  4. 32.Longest Valid Parentheses---dp

    题目链接:https://leetcode.com/problems/longest-valid-parentheses/description/ 题目大意:找出最长的括号匹配的子串长度.例子:&qu ...

  5. UVALive 5760 Alice and Bob

    题意是黑板上有n个数\(S_i\).每次操作可以把其中一个数减1或者将两个数合并为一个数.一个数变为0时,则不能再对其操作. 思路是发现最大的可操作次数为\( \sum S_i\)+(n - 1).\ ...

  6. Windows: 如何配置IPv6隧道

    清空隧道配置: netsh interface ipv6 set teredo disable netsh interface ipv6 6to4 set state disable netsh in ...

  7. 集合遍历过程iterator, 添加删除元素报异常

    list  set  遍历过程中添加或者删除元素,报异常. 使用iterator 也会报异常 ConcurrentModificationException remove只能用迭代器的remove,而 ...

  8. POJ 1661 Help Jimmy(二维DP)

    题目链接:http://poj.org/problem?id=1661 题目大意: 如图包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的 ...

  9. Linux 进程间通信(一)(经典IPC:管道、FIFO)

    管道 管道是Unix系统IPC的最古老方式,有两种局限性: (1)   历史上它们是半双工的(即数据只能在一个方向上流动),虽然现在某些系统提供了全双工管道,但是为了可移植性,不要抱有绝对的全双工假设 ...

  10. [你必须知道的.NET]第十九回:对象创建始末(下)

    本文将介绍以下内容: 对象的创建过程 内存分配分析 内存布局研究 接上回[第十八回:对象创建始末(上)],继续对对象创建话题的讨论>>> 2.2 托管堆的内存分配机制 引用类型的实例 ...