Python自定义分页组件
为了防止XSS即跨站脚本攻击,需要加上 safe
# 路由
from django.conf.urls import url
from django.contrib import admin
from mypaginator import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hosts.html$', views.hosts),
] # 视图函数
def hosts(request):
"""创建测试数据"""
# for i in range(303):
# name = "c%s.com" % i
# port = i
# models.Host.objects.create(hostname=name,port=port)
# return HttpResponse("OK") # 默认每页显示10条数据
items_per_page = 10
# 前端请求的url:http://127.0.0.1:8001/hosts.html?page=2
current_page = int(request.GET.get('page'))
# x -> items_per_page*(x-1) ~ items_per_page*x
start_item = items_per_page*(current_page-1)
end_item = items_per_page*current_page
# 通过切片的形式从数据库中拿到对应页数的items
host_list = models.Host.objects.all()[start_item:end_item] page_str = """
<a href="hosts.html?page=1">1</a>
<a href="hosts.html?page=2">2</a>
<a href="hosts.html?page=3">3</a>
""" return render(request,'hosts.html',locals()) # 前端HTML
...
<div class="pagination">
{{ page_str|safe }}
</div>
...
自定义分页组件
# 路由 from django.conf.urls import url
from django.contrib import admin
from mypaginator import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hosts.html$', views.hosts),
]
# models from django.db import models # Create your models here. class Host(models.Model):
hostname = models.CharField(max_length=32)
port = models.CharField(max_length=10)
# 分页组件: ..\paginator\utils\paginator.py #!/usr/bin/python
# -*- coding:utf-8 -*- class Paginator(object):
def __init__(self,all_count,current_page,base_url,per_page=10,per_page_count=11):
"""
分页组件的初始化
:param all_count: 数据的总条数
:param current_page: 当前页码
:param base_url: 基础url
:param per_page: 每页显示的条目数
:param per_page_count: 显示的页码数
"""
self.all_count = all_count
self.current_page = current_page
self.base_url = base_url
self.per_page = per_page
self.per_page_count = per_page_count
# 计算得出真实的页码数
pager_count, remainder = divmod(self.all_count, self.per_page)
if 0 != remainder:
pager_count += 1
self.pager_count = pager_count
# 默认每次显示11个页码(除上一页、下一页、首页和尾页之外)并且让当前选择页码始终居中
self.half_per_page_count = int(self.per_page_count / 2) @property
def start(self):
"""
数据条目的起始索引
# x -> items_per_page*(x-1) ~ items_per_page*x
:return:
"""
return self.per_page * (self.current_page - 1) @property
def end(self):
"""
数据条目的结束索引
# x -> items_per_page*(x-1) ~ items_per_page*x
:return:
"""
return self.per_page * self.current_page @property
def page_html(self):
# 获取正确的开始页码和结束页码
# 判断真实的页码数是否超过 per_page_count
if self.pager_count > self.per_page_count:
# 如果当前页 < half_per_page_count
if self.current_page <= self.half_per_page_count:
pager_start = 1
pager_end = self.per_page_count
# 如果当前页码 大于 half_per_page_count 并且 小于 pager_count - half_per_page_count
elif self.current_page <= self.pager_count - self.half_per_page_count:
pager_start = self.current_page - self.half_per_page_count
pager_end = self.current_page + self.half_per_page_count
# 如果当前页码大于 pager_count - half_per_page_count
else:
pager_start = self.pager_count - self.per_page_count + 1
pager_end = self.pager_count
else:
pager_start = 1
pager_end = self.pager_count page_list = []
first_page = '<a href="{}?page=1">首页</a>'.format(self.base_url)
page_list.append(first_page)
if self.current_page > 1:
prev = '<a href="{}?page={}">上一页</a>'.format(self.base_url,self.current_page - 1)
else:
prev = '<a href="javascript:void(0)" disabled="true">上一页</a>'
page_list.append(prev) # 循环生成HTML
for i in range(pager_start, pager_end + 1):
if i == self.current_page:
tpl = '<a class="active" href="{}?page={}">{}</a>'.format(self.base_url,i, i)
else:
tpl = '<a href="{}?page={}">{}</a>'.format(self.base_url,i, i)
page_list.append(tpl) if self.current_page < self.pager_count:
nex = '<a href="{}?page={}">下一页</a>'.format(self.base_url,self.current_page + 1)
else:
nex = '<a href="javascript:void(0)" disabled="true">下一页</a>'.format(self.current_page + 1)
page_list.append(nex) last_page = '<a href="{}?page={}">尾页</a>'.format(self.base_url,self.pager_count)
page_list.append(last_page)
page_str = "".join(page_list)
return page_str
# 视图函数 from django.shortcuts import render,HttpResponse # Create your views here. from mypaginator import models
from utils.paginator import Paginator def hosts(request):
"""创建测试数据"""
# for i in range(303):
# name = "c%s.com" % i
# port = i
# models.Host.objects.create(hostname=name,port=port)
# return HttpResponse("OK") # 后端生成好页面HTML,然后返回给前端显示
_page_str = """
<a href="hosts.html?page=1">1</a>
<a href="hosts.html?page=2">2</a>
<a href="hosts.html?page=3">3</a>
"""
# 前端请求的url:http://127.0.0.1:8001/hosts.html?page=2
current_page = int(request.GET.get('page'))
# 首先获得数据总条数
all_count = models.Host.objects.all().count()
pager = Paginator(all_count=all_count,current_page=current_page,base_url=request.path_info)
# 通过切片的形式从数据库中拿到对应页数的items
host_list = models.Host.objects.all()[pager.start:pager.end]
page_str = pager.page_html
return render(request,'hosts.html',locals())
# 前端HTML <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.mypagination a{
display: inline-block;
padding: 5px 8px;
background-color: darkslateblue;
margin: 5px;
color: white;
}
.mypagination a.active{
background-color: green;
}
</style>
</head>
<body>
<h1>主机列表</h1>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>主机名</th>
<th>端口</th>
</tr>
</thead>
<tbody>
{% for row in host_list %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.hostname }}</td>
<td>{{ row.port }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="mypagination">
{{ page_str|safe }}
</div>
</body>
</html>
Python自定义分页组件的更多相关文章
- 基于 Python 的自定义分页组件
基于 Python 的自定义分页组件 分页是网页中经常用到的地方,所以将分页功能分出来,作为一个组件可以方便地使用. 分页实际上就是不同的 url ,通过这些 url 获取不同的数据. 业务逻辑简介 ...
- Django框架---- 自定义分页组件
分页的实现与使用 class Pagination(object): """ 自定义分页 """ def __init__(self,cur ...
- Angular4.+ ngx-bootstrap Pagination 自定义分页组件
Angular4 随笔(二) ——自定义分页组件 1.简介 本组件主要是实现了分页组件显示功能,通过使用 ngx-bootstrap Pagination分页组件实现. 基本逻辑: 1.创建一个分页 ...
- vue 自定义分页组件
vue2.5自定义分页组件,可设置每页显示条数,带跳转框直接跳转到相应页面 Pagination.vue 效果如下图: all: small(只显示数字和上一页和下一页): html <temp ...
- python web 分页组件
闲来无事便写了一个易使用,易移植的Python Web分页组件.使用的技术栈是Python.Django.Bootstrap. 既然是易使用.易移植的组件,首先介绍一下其在django框架中的调用方式 ...
- vue自定义分页组件---切图网
vue2.5自定义分页组件 Pagination.vue,可设置每页显示条数,带跳转框直接跳转到相应页面,亲测有用.目前很多框架自带有分页组件比如elementUI,不过在面对一个拿到PSD稿,然后重 ...
- angular自定义分页组件(实用)
功能描述:分页,点击按钮或者下一页获取分页接口,同时active到对应页码. html模块: <page page-count="totalPage" on-click-pa ...
- Flex4 自定义分页组件
自己写的Flex4分页组件,去伪存真,只实现基本的分页功能,数据过滤神马的都不应该是分页组件干的活,有呆毛才有真相: [源代码下载] Flex自从转手给Apache后人气急跌,本人也很捉鸡,尽管Apa ...
- jquery ajax自定义分页组件(jquery.loehpagerv1.0)原创
简单的两个步骤截可调用 <script src="<%=basePath%>/resources/js/jquery-1.7.1.min.js"></ ...
随机推荐
- nagios 监控内存使用情况
监控本机内存cd /usr/lib64/nagios/pluginstouch check_mem.sh #!/bin/bash " ]; then memTotal_b=`free -b ...
- 【转】MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainC
@2018-12-18 [小记] vs-2013 编译 cJSON code in git-hub 时遇见问题 error LNK2019,解决如下 [问题描述]MSVCRTD.lib(crtexew ...
- HDU1542-Atlantis【离散化&线段树&扫描线】个人认为很全面的详解
刚上大一的时候见过这种题,感觉好牛逼哇,这都能算 如今已经不打了,不过适当写写题保持思维活跃度还是不错的,又碰到这种题了,想把它弄出来 说实话,智商不够,看了很多解析,花了4.5个小时才弄明白 网上好 ...
- Nginx加载模块
1. /usr/local/nginx/sbin/nginx -V 查看nginx版本与编译安装了哪些模块nginx version: nginx/1.10.3built by gcc 4.4.7 2 ...
- LOJ#6285. 数列分块入门 9
有点难..... 要求区间众数,所以我可以先把区间分块,然后我预处理出从第 i 块到第 j 块的众数,用dp[i][j]记录下来. 因为需要知道众数的num值, 所以我可以用一个vector来保存每个 ...
- java ee wildfly spring 在线程池的线程中注入
public class RtmpSpyingTests extends AbstractTransactionalJUnit4SpringContextTests { @Autowired Thre ...
- JS截取文件后缀名
let fileName = this.file.name.lastIndexOf(".");//取到文件名开始到最后一个点的长度 let fileNameLength = thi ...
- TYVJ1266 费解的开关
恩,这题...... 看看题面想到了啥?炮兵阵地! 再仔细一思考:炮兵阵地是求放置最多,而这个显然可以递推得出. 由于每个格子至多点一次,那么我们发现: 在第一行点击状态确定的情况下,后面每个格子的点 ...
- 第十四节、FAST角点检测(附源码)
在前面我们已经陆续介绍了许多特征检测算子,我们可以根据图像局部的自相关函数求得Harris角点,后面又提到了两种十分优秀的特征点以及他们的描述方法SIFT特征和SURF特征.SURF特征是为了提高运算 ...
- Ubuntu: Windows Help Tools For Ubuntu
Virtual Box https://www.virtualbox.org/wiki/Linux_Downloads 装不上Wine时直接装虚拟机吧.RTX真是个坑爹的东西,找不到替代的客户端 迅雷 ...