您的位置:首页 > 编程语言 > Go语言

django-自定义分页

2018-01-27 12:06 411 查看
向模板传参数方式

拼接字符串形式

封装对象方法



准备数据如下:

data = []

for i in range(1, 312):
tmp = {"id": i, "name": "safly{}".format(i)}
data.append(tmp)


向模板传参数方式

page.html

<body>
<div class="container-fluid row">
<div class="col-md-5">
<table class="table-bordered table">
<thead>
<tr>
<th>id</th>
<th>姓名</th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-md-5">
<div class="pull-right container-fluid">
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="/page/?page={{ pre }}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>

<li><a href="/page/?page=1">首页</a></li>

{% for page in total_page_list_render %}
<li><a href="/page/?page={{ page }}">{{ page }}</a></li>
{% endfor %}

<li><a href="/page/?page={{ total_page_count }}">尾页</a></li>
<li>
<a href="/page/?page={{ next }}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>

</div>
</div>
</div>
</body>


views.py

def page(request):
per_page_count = 10;

try:
currPage = int(request.GET.get("page"))

except Exception as e:
currPage = 1

page_count_show = 11;

divmod1, divmod2 = divmod(len(data), per_page_count)

if divmod2:
total_page_count = divmod1 + 1
else:
total_page_count = divmod1

page_count_show_half = page_count_show // 2

startPage = currPage - page_count_show_half

endPage = currPage + page_count_show_half

if currPage <= page_count_show_half:
startPage = 1
endPage = page_count_show
elif currPage > total_page_count - page_count_show_half:
startPage = total_page_count - page_count_show + 1
endPage = total_page_count

total_page_list_render = [i for i in range(startPage, endPage + 1)]

user_list = data[(currPage - 1) * 10:currPage * 10]

prv = currPage - 1
next = currPage + 1
print("current,prv,next", currPage, prv, next)
if prv == 0:
prv = 1
print("prv---", prv)

if next == total_page_count + 1:
next = total_page_count
print("next---", prv)

return render(request, "page.html", {"user_list": user_list,
"total_page_list_render": total_page_list_render,
"total_page_count": total_page_count,
"pre": prv,
"next": next,
})


拼接字符串形式

page1.html

<body>
<div class="container-fluid row">
<div class="col-md-5">
<table class="table-bordered table">
<thead>
<tr>
<th>id</th>
<th>姓名</th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-md-5">
<div class="pull-right container-fluid">

<nav aria-label="Page navigation">
<ul class="pagination"
{{ pageHtml |safe }}
</ul>
</nav>
</div>
</div>
</div>
</body>


views.py

def page(request):
try:
curpage = int(request.GET.get("page"))
except Exception as e:
curpage = 1

'''
页码
1 1  10
2 11 20
3 21 30
4 31 40
5 41 50
n  10*n-9  10*n
索引 10*n-10  10*n
'''

# 每页展示数量
per_page = 10
# 总页数
divmod1, divmod2 = divmod(len(data), per_page)

if divmod2:
total_page = divmod1 + 1
else:
total_page = divmod1
# 大于总页码,输出最后一页
if curpage > total_page:
curpage = total_page
# 当输出负数页码,输出第一页
if curpage <= 0:
curpage = 1

fetch_data = data[10 * (curpage - 1):10 * curpage]

# 选项卡的起始页
show_page = 11;
middle_show_page = int(show_page // 2)

start_page_index = curpage - middle_show_page
end_page_index = curpage + middle_show_page

if curpage <= middle_show_page:
start_page_index = 1
end_page_index = show_page

if curpage > total_page - middle_show_page:
start_page_index = total_page - show_page + 1
end_page_index = total_page
print(start_page_index, end_page_index)

pageHtml = ""
pageHtml += '<li><a href="/page/?page={0}" aria-label="Previous">' \
'<span aria-hidden="true">«</span></a></li>'.format(curpage - 1)

# 首页
pageHtml += '<li> <a href = "/page/?page={0}">首页</a> </li>'.format(1)

for i in range(start_page_index, end_page_index + 1):
perHtml = '<li> <a href = "/page/?page={0}">{0}</a> </li>'.format(i)
pageHtml += perHtml

# 尾页
pageHtml += '<li> <a href = "/page/?page={0}">尾页</a> </li>'.format(total_page)

pageHtml += '<li><a href="/page/?page={0}" aria-label="Next">' \
'<span aria-hidden="true">»</span></a></li>'.format(curpage + 1)

print(curpage - 1, curpage + 1, "~~~~~~~~~~~")

return render(request, "page1.html", {"user_list": fetch_data, "pageHtml": pageHtml})


封装对象方法

依然使用上例中的page1.html页面

def page(request):
page_num = request.GET.get("page")
path = request.path_info
# request.get_full_path()  # 带参数的URL
page = myPage.MyPage(page_num, len(data), path)
page_html = page.page_html()
return render(request, "page1.html", {"user_list": data[page.start:page.end], "pageHtml": page_html})


我们来看下对象封装类

myPage.py

"""
这个文件的使用指南
"""

class MyPage(object):

def __init__(self, page_num, total_count, base_url, per_page_num=10, max_show=11):
"""
:param page_num: 当前页
:param total_count: 数据总个数
:param base_url: 分页页码跳转的URL
:param per_page_num: 每一页显示多少条数据
:param max_show: 页面上最多显示多少页码
"""
# 实例化时传进来的参数
try:
self.page_num = int(page_num)  # 字符串类型,所以要转成int
except Exception as e:
self.page_num = 1
self.total_count = total_count
self.base_url = base_url
self.per_page_num = per_page_num
self.max_show = max_show
# 根据传进来的参数,计算的几个值
self.half_show = int((self.max_show - 1) / 2)
# 总共有多少页
self.total_page_num, more = divmod(self.total_count, self.per_page_num)
if more:
self.total_page_num += 1

@property
def start(self):
return (self.page_num - 1) * self.per_page_num

@property
def end(self):
return self.page_num * self.per_page_num

def page_html(self):
"""
返回页面上可以用的一段HTML
一段可用的分页页码的HTML
:return:
"""
# 页面上页码从哪儿开始
page_start = self.page_num - self.half_show
# 页面上页码最多展示到哪一个
page_end = self.page_num + self.half_show
# 如果当前页小于等于half_show, 默认从第一页展示到max_show
if self.page_num <= self.half_show:
page_start = 1
page_end = self.max_show
# 如果当前页大于等于总页数-half_show
if self.page_num >= self.total_page_num - self.half_show:
page_end = self.total_page_num
page_start = self.total_page_num - self.max_show

# 生成前页码的HTML
page_html_list = []
# 放置一个首页按钮
page_first_tmp = '<li><a href="{}?page=1">首页</a></li>'.format(self.base_url)
page_html_list.append(page_first_tmp)

# 加上一页按钮
if self.page_num - 1 <= 0:  # 表示没有上一页
page_prev_tmp = '<li class="disabled" ><a href="#">上一页</a></li>'
else:
page_prev_tmp = '<li><a href="{0}?page={1}">上一页</a></li>'.format(self.base_url, self.page_num - 1)
page_html_list.append(page_prev_tmp)

for i in range(page_start, page_end + 1):
# 如果是当前页,就加一个active的样式
if i == self.page_num:
tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)
else:
tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)
page_html_list.append(tmp)
# 加下一页按钮
if self.page_num + 1 > self.total_page_num:
page_next_tmp = '<li class="disabled"><a href="#">下一页</a></li>'
else:
page_next_tmp = '<li><a href="{0}?page={1}">下一页</a></li>'.format(self.base_url, self.page_num + 1)
page_html_list.append(page_next_tmp)
# 添加一个尾页
page_last_tmp = '<li><a href="{0}?page={1}">尾页</a></li>'.format(self.base_url, self.total_page_num)
page_html_list.append(page_last_tmp)

return "".join(page_html_list)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: