Django框架 Pagination分页实现代码实例

一、自定义分页

1、基础版自定义分页

data = []

for i in range(1, 302):

tmp = {"id": i, "name": "alex-{}".format(i)}

data.append(tmp)

print(data)

def user_list(request):

# user_list = data[0:10]

# user_list = data[10:20]

try:

current_page = int(request.GET.get("page"))

except Exception as e:

current_page = 1

per_page = 10

# 数据总条数

total_count = len(data)

# 总页码

total_page, more = divmod(total_count, per_page)

if more:

total_page += 1

# 页面最多显示多少个页码

max_show = 11

half_show = int((max_show-1)/2)

if current_page <= half_show:

show_start = 1

show_end = max_show

else:

if current_page + half_show >= total_page:

show_start = total_page - max_show

show_end = total_page

else:

show_start = current_page - half_show

show_end = current_page + half_show

# 数据库中获取数据

data_start = (current_page - 1) * per_page

data_end = current_page * per_page

user_list = data[data_start:data_end]

# 生成页面上显示的页码

page_html_list = []

# 加首页

first_li = '<li><a href="/user_list/?page=1" rel="external nofollow" >首页</a></li>'

page_html_list.append(first_li)

# 加上一页

if current_page == 1:

prev_li = '<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'

else:

prev_li = '<li><a href="/user_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'.format(current_page - 1)

page_html_list.append(prev_li)

for i in range(show_start, show_end+1):

if i == current_page:

li_tag = '<li class="active"><a href="/user_list/?page={0}" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)

else:

li_tag = '<li><a href="/user_list/?page={0}" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)

page_html_list.append(li_tag)

# 加下一页

if current_page == total_page:

next_li = '<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'

else:

next_li = '<li><a href="/user_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'.format(current_page+1)

page_html_list.append(next_li)

# 加尾页

page_end_li = '<li><a href="/user_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(total_page)

page_html_list.append(page_end_li)

page_html = "".join(page_html_list)

return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

2、封装保存版

class Pagination(object):

def __init__(self, current_page, total_count, base_url, per_page=10, max_show=11):

"""

:param current_page: 当前页

:param total_count: 数据库中数据总数

:param per_page: 每页显示多少条数据

:param max_show: 最多显示多少页

"""

try:

current_page = int(current_page)

except Exception as e:

current_page = 1

self.current_page = current_page

self.total_count = total_count

self.base_url = base_url

self.per_page = per_page

self.max_show = max_show

# 总页码

total_page, more = divmod(total_count, per_page)

if more:

total_page += 1

half_show = int((max_show - 1) / 2)

self.half_show = half_show

self.total_page = total_page

@property

def start(self):

return (self.current_page - 1) * self.per_page

@property

def end(self):

return self.current_page * self.per_page

def page_html(self):

if self.current_page <= self.half_show:

show_start = 1

show_end = self.max_show

else:

if self.current_page + self.half_show >= self.total_page:

show_start = self.total_page - self.max_show

show_end = self.total_page

else:

show_start = self.current_page - self.half_show

show_end = self.current_page + self.half_show

# 生成页面上显示的页码

page_html_list = []

# 加首页

first_li = '<li><a href="{}?page=1" rel="external nofollow" >首页</a></li>'.format(self.base_url)

page_html_list.append(first_li)

# 加上一页

if self.current_page == 1:

prev_li = '<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'

else:

prev_li = '<li><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'.format(self.base_url, self.current_page - 1)

page_html_list.append(prev_li)

for i in range(show_start, show_end + 1):

if i == self.current_page:

li_tag = '<li class="active"><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{1}</a></li>'.format(self.base_url, i)

else:

li_tag = '<li><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{1}</a></li>'.format(self.base_url, i)

page_html_list.append(li_tag)

# 加下一页

if self.current_page == self.total_page:

next_li = '<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'

else:

next_li = '<li><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'.format(self.base_url, self.current_page + 1)

page_html_list.append(next_li)

# 加尾页

page_end_li = '<li><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(self.base_url, self.total_page)

page_html_list.append(page_end_li)

return "".join(page_html_list)

3、封装保存版使用指南

def user_list(request):

pager = Pagination(request.GET.get("page"), len(data), request.path_info)

user_list = data[pager.start:pager.end]

page_html = pager.page_html()

return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

二、Django内置分页

1、内置分页view部分

from django.shortcuts import render

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

L = []

for i in range(999):

L.append(i)

def index(request):

current_page = request.GET.get('p')

paginator = Paginator(L, 10)

# per_page: 每页显示条目数量

# count: 数据总个数

# num_pages:总页数

# page_range:总页数的索引范围,如: (1,10),(1,200)

# page: page对象

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(1)

except EmptyPage:

posts = paginator.page(paginator.num_pages)

return render(request, 'index.html', {'posts': posts}) 

2、内置分页HTML部分

<!DOCTYPE html>

<html>

<head lang="en">

<meta charset="UTF-8">

<title></title>

</head>

<body>

<ul>

{% for item in posts %}

<li>{{ item }}</li>

{% endfor %}

</ul>

<div class="pagination">

<span class="step-links">

{% if posts.has_previous %}

<a href="?p={{ posts.previous_page_number }}" rel="external nofollow" >Previous</a>

{% endif %}

<span class="current">

Page {{ posts.number }} of {{ posts.paginator.num_pages }}.

</span>

{% if posts.has_next %}

<a href="?p={{ posts.next_page_number }}" rel="external nofollow" >Next</a>

{% endif %}

</span>

</div>

</body>

</html>

以上是 Django框架 Pagination分页实现代码实例 的全部内容, 来源链接: utcz.com/z/318383.html

回到顶部