django - 列表分页代码
1. 案例代码 :
''' 自定义分页组件 views.py 代码 from app.utils.pagetions import Pagetions queryset = models.Number.objects.filter(**data_dict).order_by('id') page_object = Pagetions(request, queryset) context = { 'queryset': page_object.page_queryset, 'page_string': page_object.html() } return render(request, 'number_list.html',context ) 在html 页面中代码 {% for item in queryset %} {{ item.字段 }} {% endfor %} <ul class="pagination"> {{ page_string }} </ul> ''' #page_string = ''.join(page_ste_list) 变为安全必须得导包 from django.utils.safestring import mark_safe class Pagetions(object): def __init__(self, request, queryset, page_param='page', page_size=10, plus=3): page = int(request.GET.get(page_param, "1")) # if page.isdecimal: # page = int(page) # else: # page = 1 self.page = page self.page_size = page_size self.start = (page - 1) * page_size # 开始数据 self.end = page * page_size # 结束数据 self.page_queryset = queryset[self.start: self.end] # 查询数据库中所有数据的 个数 total_count = queryset.count() # 总页码 total_page_count, div = divmod(total_count, page_size) if div: total_page_count += 1 self.total_page_count = total_page_count self.plus = plus def html(self): # 计算页码显示 前后页数 # 极致的判断 if self.total_page_count <= 2 * self.plus + 1: start_page = 1 end_page = self.total_page_count else: # 第一页的极值处理方式 当数据小于 3 if self.page <= self.plus: start_page = 1 end_page = 2 * self.plus + 1 else: # 最后一页极值 处理方式 if self.page + self.plus > self.total_page_count: end_page = self.total_page_count start_page = self.total_page_count - 2 * self.plus else: start_page = self.page - self.plus end_page = self.page + self.plus # 页码 page_str_list = [] # 首页 page_str_list.append('<li class="hidden-xs"><a href="?page={}"> 首页 </a></li>'.format(1)) # 上一页 if self.page > 1: pev = '<li><a href="?page={}"> 上一页 </a></li>'.format(self.page - 1) else: pev = '<li><a href="?page={}"> 上一页 </a></li>'.format(1) page_str_list.append(pev) # 中间页面 for i in range(start_page, end_page + 1): if i == self.page: ele = '<li class="active"><a href="?page={}">{}</a></li>'.format(i, i) else: ele = '<li><a href="?page={}">{}</a></li>'.format(i, i) page_str_list.append(ele) # 下一页 if self.page < self.total_page_count: pev = '<li><a href="?page={}"> 下一页 </a></li>'.format(self.page + 1) else: pev = '<li><a href="?page={}"> 下一页 </a></li>'.format(self.total_page_count) page_str_list.append(pev) # 尾页 page_str_list.append('<li class="hidden-xs"><a href="?page={}"> 尾页 </a></li>'.format(self.total_page_count)) # 调转页面 search_str =''' <form method="get"> <div class="col-sm-3 hidden-xs"> <div class="input-group"> <input type="text" name="page" class="form-control" placeholder="搜索"> <span class="input-group-btn"> <button class="btn btn-default" type="submit">跳转</button> </span> </div> </div> </form> ''' page_str_list.append(search_str) # mark_safe() 需要导包 page_string = mark_safe(''.join(page_str_list)) return page_string
2. html代码 :
<ul class="pagination"> {{ page_string }} </ul>
3. views代码 代码放在 list查询中 图 1
from django.core.exceptions import ValidationError
from app import models
from django import forms
from django.shortcuts import render, redirect
from app.utils.pagetions import Pagetions
def number_list(request):
# 查询所有数据
# 查询 电话号码 mobile
data_dict = {}
value = request.GET.get('q', '')
if value:
data_dict['mobile__contains'] = value
response = models.Number.objects.filter(**data_dict).order_by('id')
# 分页
page_object = Pagetions(request, response)
context = {
'value': value,
'response': page_object.page_queryset,
'page_string': page_object.html()
}
return render(request, 'number_list.html', context)
图 1


浙公网安备 33010602011771号