数据分页显示

分页及优化

先思考一个问题,现在假设已知有100页数据,当前是第1页,要得出1-10的页码数,而当前如果是第50页,则要输出46-55的页码数

def pageshow(count,p):
    '''
        count 总页数,p  当前页
        begin 开始页 
        end 结束页
    '''
    # 开始页
    begin = p-4
    # 结束页
    end = p+5
    # 判断如果当前页 小于5
    if p < 5:
        # 则开始页为1
        begin = 1
        # 结束页为10
        end = 10
    # 当前页在最后五页之内
    if p > count-5:
        # 则开始页为总页数-9
        begin = count - 9
        # 结束页为总页数
        end = count
    # 判断如果开始页 小于等于 0,则开始页为1
    if begin <= 0:
        begin = 1

    s = ''
    for x in range(begin,end+1):
        print(x)


pageshow(100,50)

1. 自定义过滤器

在当前应用目录下创建templatetags目录和pagetag.py文件

可以在模板中使用{ % load pagetag % }加载

自定义过滤器注意事项:

  • templatetags目录名不能更改
  • pagetag.py文件可以自定义,但对应的在模板中加载时也需要更改名字
templatetags
    ├── pagetag.py
    ----------------pagetag.py-------------------------
    from django import template
    register = template.Library()

    # 自定义页面优化显示标签
    @register.simple_tag
    def PageShow(count,request):
        # 当前页码数,默认为1
        p = int(request.GET.get('p',1))
        begin = p - 4
        end = p + 5
		# 当前页在最后五页之内
        if p > count-5:
            begin = count - 9
            end = count
		# 当前页在前五页之内
        if p < 5:
            begin = 1
            end = 10
		#总页数少于十页
        if count < 10:
            begin = 1
            end = count

        # 获取当前请求的url
        url = request.path
        # 获取当前请求中的参数 
        # 去除参数中的p
        args = ''
        for k,v in request.GET.items():
            if k != 'p':
                args += '&'+k+'='+v
        s = ''
        # 首页
        s += '<li><a href="{url}?p={v}{args}">首页</a></li>'.format(v=1,url=url,args=args)
        # 判断上一页
        if p == 1:
            s += '<li><a href="{url}?p={v}{args}">上一页</a></li>'.format(v=1,url=url,args=args)
        else:
            s += '<li><a href="{url}?p={v}{args}">上一页</a></li>'.format(v=p-1,url=url,args=args)
        # 循环页码数
        for x in range(begin,end+1):
            if x == p:
                s += '<li class="am-active"><a href="{url}?p={v}{args}">{v}</a></li>'.format(v=x,url=url,args=args)
            else:
                s += '<li ><a href="{url}?p={v}{args}">{v}</a></li>'.format(v=x,url=url,args=args)
        # 判断下一页
        if p == count:
            s += '<li><a href="{url}?p={v}{args}">下一页</a></li>'.format(v=count,url=url,args=args)
        else:
            s += '<li><a href="{url}?p={v}{args}">下一页</a></li>'.format(v=p+1,url=url,args=args)
        # 尾页
        s += '<li><a href="{url}?p={v}{args}">尾页</a></li>'.format(v=count,url=url,args=args)

        # 总页数
        s += '<li>共{v}页</li>'.format(v=count)

        return format_html(s)

2. 定义路由

# 后台商品列表
url(r'^goodsindex', goodsviews.goodsindex,name="goodsindex"),

3. 定义视图函数,并查询数据,进行分页

# 获取分页的数据
ob = Goods.objects()

# 数据分页
from django.core.paginator import Paginator
# 实例化分页类
paginator = Paginator(ob,2)
# 获取当前页码
p = int(request.GET.get('p',1))
# 获取分页数据对象[{id:1},{id:2}]  [{id:3},{id:4}]
goodslist= paginator.page(p)
# 分配数据
context = {'goods':goodslist}

4. 定义模板.加载数据和分页数据

{ % load adminpagetag % }
{ % PageShow goods.paginator.num_pages request % }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Flask 中使用 PyMySQL 进行数据分页显示的步骤如下: 1. 安装 Flask 和 PyMySQL ```bash pip install Flask PyMySQL ``` 2. 在 Flask 中连接数据库 ```python from flask import Flask import pymysql app = Flask(__name__) # 连接数据库 def get_conn(): conn = pymysql.connect( host='localhost', user='root', password='password', database='test_db', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) return conn # 关闭数据库连接 @app.teardown_appcontext def close_conn(exception): conn = get_conn() conn.close() ``` 3. 定义路由函数并查询数据 ```python @app.route('/list/<int:page>') def user_list(page): page_size = 10 # 每页显示数据量 start = (page - 1) * page_size # 计算查询的起始位置 # 查询数据 conn = get_conn() with conn.cursor() as cursor: sql = f"SELECT * FROM user LIMIT {start}, {page_size};" cursor.execute(sql) result = cursor.fetchall() # 计算总页数 with conn.cursor() as cursor: sql = "SELECT COUNT(*) AS count FROM user;" cursor.execute(sql) total_count = cursor.fetchone()['count'] total_page = (total_count + page_size - 1) // page_size # 渲染模板并返回数据 return render_template('user_list.html', users=result, current_page=page, total_page=total_page) ``` 4. 在模板中显示分页数据 ```html {% extends 'base.html' %} {% block content %} <h1>User List</h1> <table> <thead> <tr> <th>ID</th> <th>Name</th> <th>Age</th> </tr> </thead> <tbody> {% for user in users %} <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> <td>{{ user.age }}</td> </tr> {% endfor %} </tbody> </table> <nav> {% if current_page > 1 %} <a href="{{ url_for('user_list', page=current_page-1) }}">上一页</a> {% endif %} {% if current_page < total_page %} <a href="{{ url_for('user_list', page=current_page+1) }}">下一页</a> {% endif %} </nav> {% endblock %} ``` 这样就可以在 Flask 中使用 PyMySQL 进行数据分页显示了。需要注意的是,这里的分页方式是基于数据的物理位置来分页的,因此需要保证查询的结果集是按照预期的顺序排列的。如果需要按照特定的字段排序,可以在 SQL 语句中添加 `ORDER BY` 子句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值