Django 自定义分页
定一个一个类
# 说明
#1.通过传入对应的参数,自动生成html标签代码 ,并返回,前段只需接收并渲染显示即可
#2.请注意标签内的网址接口,如更改,请修改对应的值
class PageInfo:
def __init__(self, cur_page, total, per_page=10, show_page=11):
self.cur_page = cur_page
self.per_page = per_page
self.total = total
self.show_page = show_page
a, b = divmod(self.total, self.per_page)
if b:
a = a + 1
self.total_page = a #### 总页数
#### 获取起始索引
def get_start(self):
start = (self.cur_page - 1) * self.per_page
return start
#### 获取结束索引
def get_end(self):
return self.cur_page * self.per_page
def get_page(self):
half = (self.show_page - 1) // 2
#### taotal_page = 5 < show_page = 11
if self.total_page < self.show_page:
begin = 1
end = self.total_page
else:
#### 左边极值判断
if self.cur_page - half <= 0:
begin = 1
# end = self.cur_page + half
end = self.show_page
#### 右边极值的判断
elif self.cur_page + half > self.total_page:
# begin = self.cur_page - half
begin = self.total_page - self.show_page + 1
end = self.total_page ### 31
#### 正常页码判断
else:
begin = self.cur_page - half
end = self.cur_page + half
page_list = []
if self.cur_page == 1:
astr = "<li><a href='#' aria-label='Previous'><span aria-hidden='true'>«</span></a></li>"
else:
astr = "<li><a href='/classes/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>«</span></a></li>" % (
self.cur_page - 1)
page_list.append(astr)
for i in range(begin, end + 1):
if self.cur_page == i:
# astr = "<a style='display:inline-block; padding:5px;margin:5px;background-color:red;' href='/custom/?cur_page=%s'>%s</a>" % (i, i)
astr = "<li class='active'><a href='/classes/?cur_page=%s'>%s</a></li>" % (i, i)
else:
# astr = "<a style='display:inline-block; padding:5px;margin:5px' href='/custom/?cur_page=%s'>%s</a>" % (i, i)
astr = "<li><a href='/classes/?cur_page=%s'>%s</a></li>" % (i, i)
page_list.append(astr)
if self.cur_page == self.total_page:
astr = "<li><a href='#' aria-label='Next'><span aria-hidden='true'>»</span></a></li>"
else:
astr = "<li><a href='/classes/?cur_page=%s' aria-label='Next'><span aria-hidden='true'>»</span></a></li>" % (
self.cur_page + 1)
page_list.append(astr)
s = " ".join(page_list)
return s
定义一个函数来实现类的使用
def classes(request):
if request.method == 'GET':
cur_page = request.GET.get('cur_page') #首先获取前端传来的url参数
if not cur_page: # 有的是直接传过来一个没有参数的 ,我们默认给他一个第一页
cur_page = 1
cur_page = int(cur_page) #因为传过来的是一个文本类型,要转换成整型
res = models.Classes.objects.all() #连接数据库,获取全部信息
total = models.Classes.objects.count() #连接数据库获取数据库总数量
page = PageInfo(cur_page, total) #实例化上边的类
start = page.get_start() #通过类获取起始页
end = page.get_end() #通过类获取结束页
user_list = models.Classes.objects.all()[start:end] #连接数据库通过获取指定范围的数据,相当于原生SQL的limit
return render(request, "classes.html", {'classes': res, "user_list": user_list, "page": page}) #最后将获取的数据一并发给前段
前段渲染实现方式
//说明: 使用了bootstrap美化,
<table border="1px" class="table table-bordered table-hover table-striped">
<thead> //标题头
<tr>
<th>ID</th>
<th>班级名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for item in user_list %} //这里是渲染后端传来的分页后的数据
<tr>
<td>{{ item.cid }}</td>
<td>{{ item.cname }}</td>
<td>
//这段代码可以忽略
<a href="/del_classes/?cid={{ item.cid }}" class="dele btn btn-danger">删除</a>
<a href="/up_class/?cid={{ item.cid }}" class="btn btn-info">更新</a>
<button class="ajax_up btn btn-success">ajax更新</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<nav aria-label="Page navigation">
<ul class="pagination">
{{ page.get_page | safe}} //这里显示的是分页导航栏,也就是有多少页 分出多少个按钮
</ul>
</nav>