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、页面展示

Django自定义分页并保存搜索条件的更多相关文章

  1. Django - 自定义分页、FBV和CBV

    一.自定义分页(优势在于能够保存搜索条件) """ 分页组件使用示例: 1) 先取出所有数据USER_LIST 2) 实例化: obj = Pagination(requ ...

  2. django 自定义分页,网址存储缓存,CBV

    1. 通过切片控制分页 自定义分页: from django.shortcuts import render # Create your views here. from app01.models i ...

  3. 接前一篇:new select option保存搜索条件

    WD_SELECT_OPTIONS_20新加了很多好玩的东西,尤其是里面的保存搜索条件和使用保存的搜索条件.因为这个比较想WEB UI,所以兴趣比较高一点,WEB UI里是把参数拼成XML存起来的,我 ...

  4. Django自定义分页、bottle、Flask

    一.使用django实现之定义分页 1.自定义分页在django模板语言中,通过a标签实现; 2.前段a标签使用<a href="/user_list/?page=1"> ...

  5. Django自定义分页

    分页 自定义分页 稳扎稳打版 def book(request): # 从URL取参数(访问的页码) page_num = request.GET.get("page") try: ...

  6. thinkphp5 列表页数据分页查询3-带搜索条件

    先加载模板然后在前端HTML页面请求数据 /** * 加载列表页模板 * @author 冯广福 */ public function index() { LogWriteService::write ...

  7. Django 自定义分页类

    分页类代码: class Page(object): ''' 自定义分页类 可以实现Django ORM数据的的分页展示 输出HTML代码: 使用说明: from utils import mypag ...

  8. Django—自定义分页

    分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页 ...

  9. Django——自定义分页(可调用)

    1.view from django.shortcuts import render,HttpResponse # Create your views here. from app01.models ...

随机推荐

  1. CF2B The least round way(贪心+动规)

    题目 CF2B The least round way 做法 后面\(0\)的个数,\(2\)和\(5\)是\(10\)分解质因数 则把方格中的每个数分解成\(2\)和\(5\),对\(2\)和\(5 ...

  2. Linux下SSH命令使用方法详解(摘自网络)

    备注:检查自己的linux系统中是否已经安装了某一些软件的命令: rpm -qa | grep 软件名  例如 rpm -qa | grep  vsftpd 1.查看SSH客户端版本 有的时候需要确认 ...

  3. 8.3 Customizing Git - Git Hooks

    https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...

  4. vue-resource在vuecli3中请求headers修改

    this.$resource.delete({ user_code: Cookie.get("empid"), date: date, file_name: file_name } ...

  5. js根据数据条数与每页多少条数据计算页数,js前端计算页数

    /**  *根据数据条数与每页多少条数据计算页数   * totalnum 数据条数  * limit 每页多少条  */ function pageCount (totalnum,limit){   ...

  6. https://www.cnblogs.com/

    Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000 # lsof -i:8000 COMMAND PID USER ...

  7. PAT 甲级 1038 Recover the Smallest Number (30 分)(思维题,贪心)

    1038 Recover the Smallest Number (30 分)   Given a collection of number segments, you are supposed to ...

  8. Python网络编程之TCP套接字简单用法示例

    Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...

  9. 十六章 综合实例——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 简单的实体关系图 简单数据字典 用户(sys_user) 名称 类型 长度 描述 id bigint 编号 主键 username varchar 100 用户名 pa ...

  10. Docker 容器的通信(十二)

    目录 一.容器间通信 1.IP 通信 2.Docker DNS Server 3.joined 容器 二.容器访问外部网络 三.外部网络访问容器 1.随机端口 2.指定端口 3.不指定任何端口. 4. ...