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

 

posted @ 2022-05-28 15:09  我在春天等伱  阅读(42)  评论(0)    收藏  举报