文档章节

Django自定义分页并保存搜索条件

o
 osc_wws45aot
发布于 2019/08/20 04:42
字数 614
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

Django自定义分页并保存搜索条件

1、自定义分页组件pagination.py

import copy


class Pagination:
    def __init__(self, current_page_num, all_count, request, per_page_num=10, page_count=11):
        """
        封装分页相关数据
        :param current_page_num: 当前页码数
        :param all_count: 数据库中总数据条数
        :param per_page_num: 每页显示的数据量
        :param page_count: 最大显示页数
        """

        try:
            current_page = int(current_page_num)
        except Exception as e:
            current_page = 1

        # 页码数小于1时显示第一页
        if current_page < 1:
            current_page = 1

        # 取总页码数
        self.all_page_count, temp = divmod(all_count, per_page_num)
        if temp:
            self.all_page_count += 1

        # 页码数大于最大页码数时显示最后一页
        if current_page > self.all_page_count:
            current_page = self.all_page_count

        self.current_page = current_page
        self.per_page_num = per_page_num
        self.half_page_count = int((page_count - 1) / 2)

        # 总页码数小于最大页码数
        if self.all_page_count < page_count:
            self.start_page = 1
            self.end_page = self.all_page_count + 1
        else:
            if self.current_page < self.half_page_count:
                # 当页码条数据靠近最左边时
                self.start_page = 1
                self.end_page = page_count + 1
            elif self.all_page_count - self.current_page < self.half_page_count:
                # 当页码条数据靠近最右边时
                self.start_page = self.all_page_count - page_count + 1
                self.end_page = self.all_page_count + 1
            else:
                # 页码条正常显示在中间位置
                self.start_page = self.current_page - self.half_page_count
                self.end_page = self.current_page + self.half_page_count + 1

        # 获取get参数: <QueryDict:{key: value}>
        params = request.GET
        # 不进行deepcopy将无法改变其里面的值
        self.new_params = copy.deepcopy(params)

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

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

    def show_html(self):
        html_list = []
        if self.current_page == 1:
            first_page = '<li class="disabled"><a>{0}</a></li>'.format('首页')

        else:
            # 将page传入new-params中
            self.new_params['page'] = 1
            # 对new_params进行urlencode格式化: 'key=value&key2=value2&page=1'
            first_page = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), '首页')
        # 将"首页"html代码加入html_list中
        html_list.append(first_page)

        if self.current_page == 1:
            prev_page = '<li class="disabled"><a>{0}</a></li>'.format('&laquo;')
        else:
            self.new_params['page'] = self.current_page - 1
            prev_page = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), '&laquo;')

        # 将"上一页"html代码加入html_list中
        html_list.append(prev_page)

        for i in range(self.start_page, self.end_page):
            if self.current_page == i:
                page_bar = '<li class="active"><a>{0}</a></li>'.format(i)
            else:
                self.new_params['page'] = i
                page_bar = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), i)

            # 将"每一页"html代码加入html_list中
            html_list.append(page_bar)

        if self.current_page == self.all_page_count:
            next_page = '<li class="disabled"><a>{0}</a></li>'.format('&raquo;')
        else:
            self.new_params['page'] = self.current_page + 1
            next_page = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), '&raquo;')

        # 将"下一页"html代码加入html_list中
        html_list.append(next_page)

        if self.current_page == self.all_page_count:
            last_page = '<li class="disabled"><a>{0}</a></li>'.format('尾页')
        else:
            self.new_params['page'] = self.all_page_count
            last_page = '<li><a href="?{0}">{1}</a></li>'.format(self.new_params.urlencode(), '尾页')

        # 将"尾页"html代码加入到html_list中
        html_list.append(last_page)

        return ''.join(html_list)

2、view视图

class CustomerView(View):
    def get(self, request):
        customer_list = Customer.objects.all()
        page = request.GET.get('page')
        # 实例化pagination对象
        pagination = Pagination(page, customer_list.count(), request, per_page_num=1)
        # 对数据列表进行分页
        customer_list = customer_list[pagination.start:pagination.end]
        context = {
            'customer_list': customer_list,
            'page_html': pagination.show_html()
        }
        return render(request, 'customer_list.html', context)

    def post(self, request):
        pass

3、templates模板

<nav aria-label="Page navigation" class="pull-right">
    <ul class="pagination">
        {{ page_html|safe }}
     </ul>
</nav>

4、页面展示

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Django【十六】自定义分页

自定义分页:功能: 首尾页跳转 保存搜索条件 #自定义分页 008000;">官方推荐,页码数为奇数 class PageNation: @property @property View Code # 公共客户信息展示@login_requireddef cu...

osc_r65unu6p
2019/09/28
0
0
18 Django - 自定义分页、FBV和CBV

Django - 自定义分页、FBV和CBV 一、自定义分页(优势在于能够保存搜索条件) """分页组件使用示例: """ class Pagination(object): 实际总页码 保存搜索条件 如果总页码 <= 11: 总页码 > ......

osc_iqk0y05x
2018/12/06
2
0
Django-CRM后台管理系统

crm整体流程 表结构 from django.db import models# Create your models here.from django.contrib.auth.models import AbstractUserfrom django.db import modelsfrom django.contrib impor......

osc_4e303yxy
2019/06/20
4
0
drf搜索过滤组件; drf排序过滤组件;drf基础分页组件; drf偏移分页组件; drf游标分页组件; 自定义过滤器; 过滤器插件:django-filter

准备:群查接口各种筛选组件数据准备 #1.models.py class Car(models.Model): #2.admin.py from . import models admin.site.register(models.Car) #3.serializers.py class CarModelSeriali......

osc_wfgyoc6f
2019/10/24
5
0
WEB框架-Django组件学习-分页器学习

1.分页器基础学习 1.1 补充知识-批量创建 数据库中数据批量创建,不要每创建一个就往数据库中塞一个,会造成撞库,造成大量I/O操作,速速较慢,应该采用一次性创建大量数据,一次性将大量数据...

osc_yz2rojzt
2019/04/17
2
0

没有更多内容

加载失败,请刷新页面

加载更多

我们一定会在人生的更高处相见的

2020.6.7 我知道没人会看到 2021.6.7 我再来写下 每天进步一点点 一年后我就是不一样的我 你也是。 高考加油!

osc_9oidllr2
14分钟前
7
0
esp8266物联网开发一:MicroPython初战江湖

用esp8266做的物联网开发,涉及到固件烧写,固件擦除,代码编写等方面,做一一记录。 1. 固件烧写 首先,下载固件烧写工具:https://www.espressif.com/sites/default/files/tools/flash_dow...

osc_s2b5kacl
16分钟前
20
0
获小黄衫有感

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2020SpringW/ 一、与软工的开始 在选课的时候咨询学长意见,听上届学长说这门课会有寒假作业,心里很忐忑,又抱有侥幸心理——可能...

osc_r5t7sskd
17分钟前
9
0
ppt 视频不显示控制条

1 正常解决方法 2 如果还不能显示可能是ppt是兼容模式,另存为非兼容模式就好了 后缀是.ppt 现存就好了

osc_hzf6peqc
18分钟前
15
0
五笔经常打不出来的字:温故而知新

遍 ynmp 凸凹 hgmm 凸 hgm 凹mmgd

osc_iy56i6w3
20分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部