You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复aiogram 3.0中内联按钮分页重复显示问题

问题修复:aiogram 3.0 内联按钮分页重复数据问题

问题根源

  1. 按钮数据索引错误:paginator函数循环创建按钮时,始终固定使用data[page],导致每页5个按钮都指向同一条数据,没有遍历当前页的多条记录。
  2. 页码边界判断错误:分页切换时的下一页条件逻辑错误,无法正确识别是否还有更多数据页。

修正后的代码

cur.execute("SELECT * FROM data")
data = cur.fetchall()
# 计算总页数,兼容数据总数不是5的倍数的情况
total_pages = (len(data) + 4) // 5

def paginator(page: int=0):
    builder = InlineKeyboardBuilder()
    # 计算当前页的起始、结束索引
    start_idx = page * 5
    end_idx = start_idx + 5
    # 遍历当前页的数据集(剩余数据不足5条时自动取到末尾)
    for item in data[start_idx:end_idx]:
        button = InlineKeyboardButton(text=item[0], callback_data=item[1])
        builder.add(button)
    builder.adjust(1)
    # 按需添加分页按钮(仅存在对应页面时显示)
    pagination_buttons = []
    if page > 0:
        pagination_buttons.append(InlineKeyboardButton(text="⬅", callback_data=kb.Pagination(action="prev", page=page).pack()))
    if page < total_pages - 1:
        pagination_buttons.append(InlineKeyboardButton(text="➡", callback_data=kb.Pagination(action="next", page=page).pack()))
    if pagination_buttons:
        builder.row(*pagination_buttons, width=2)
    return builder.as_markup()

@dp.callback_query(kb.Pagination.filter(F.action.in_(["prev", "next"])))
async def pagination_handler(call: CallbackQuery, callback_data: kb.Pagination):
    page_num = int(callback_data.page)
    page = page_num
    # 处理上一页/下一页逻辑,限制页码在有效范围内
    if callback_data.action == "prev":
        page = max(page_num - 1, 0)
    elif callback_data.action == "next":
        page = min(page_num + 1, total_pages - 1)

    with suppress(TelegramBadRequest):
        await call.message.edit_text(
            "list",
            reply_markup=paginator(page)
        )
    await call.answer()

@dp.message()
async def echo(message: Message):
    msg = message.text.lower()
    if msg == "list":
        await message.answer("list", reply_markup=paginator(0))

关键修改说明

  • 分页数据区间计算:通过page * 5确定当前页起始索引,截取对应区间的数据集循环创建按钮,确保每页显示不同的5条数据。
  • 总页数适配:用(len(data)+4)//5计算总页数,自动处理数据总数不是5的倍数的场景。
  • 分页按钮逻辑优化:仅在存在上一页/下一页时显示对应按钮,避免无效操作。
  • 页码边界限制:用max和min确保页码始终在0到总页数-1的有效范围内。

内容的提问来源于stack exchange,提问作者nerduz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:03:14