У меня есть пагинация корзины которая динамически изменяется при нажатии на кнопки, все данные достаются из бд, единственное я не могу реализовать кнопку удалить товар из корзины, сами данные товара удаляются из списка, но в 'next_basket' все равно передается изначальный список без изменений если что в моем списке всегда неизменен первый подсписок под индексом [0] так как это стартовый вывод корзины с общей информацией по типу: в вашей корзине - n товаров, на n-ую сумму. а все остальные подсписки списка я хочу удалять по нажатию на определенную кнопку и передавать результат в пагинацию.
from aiogram import F, Router
from contextlib import suppress
from aiogram.exceptions import TelegramBadRequest
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, FSInputFile
from aiogram.types.input_media_photo import InputMediaPhoto
from src.services import DataBase1
from src.keyboards import menu_inline_order
from src import keyboards
router: Router = Router()
db1 = DataBase1('tg_order.db')
list_messag = []
list_full_basket = [[]]
list_basket_delete = None
@router.callback_query(keyboards.Basket.filter(F.action.in_(['prev_basket', 'next_basket', 'delete_basket'])))
async def pagination_handler(call: CallbackQuery, callback_data: keyboards.Basket):
global list_basket_delete
page_num_basket = int(callback_data.page)
page_basket = page_num_basket - 1 if page_num_basket > 0 else 0
media_photo = FSInputFile('gh.png')
if callback_data.action == 'next_basket':
await call.answer()
page_basket = page_num_basket + 1 if page_num_basket < (len(list_full_basket) - 1) else page_num_basket
if callback_data.action == 'delete_basket':
page_basket = page_num_basket - 1 if page_num_basket > 0 else 0
await call.answer()
data = await db1.select_label(call.from_user.id)
print(page_basket)
print(data)
if page_basket == 0:
list_basket_delete = list_full_basket[: -1]
print(list_basket_delete)
return list_basket_delete
else:
list_basket_delete = list_full_basket[: page_basket]
return list_basket_delete
with suppress(TelegramBadRequest):
list_basket_delete = list_full_basket
print(list_basket_delete)
await call.message.edit_media(InputMediaPhoto(
media=media_photo if page_basket == 0 else list_basket_delete[page_basket][0],
caption=f'{list_basket_delete[page_basket][1]}'),
reply_markup=keyboards.paginator_basket(page_basket) if page_basket > 0 else keyboards.paginator_basket_start()
)
@router.callback_query(F.data == 'basket')
async def check_history(call: CallbackQuery, state: FSMContext):
await state.clear()
await call.message.delete()
await call.answer()
await db1.delete_null(call.from_user.id)
await db1.add_task_history(call.from_user.id)
photo_p = 'gh.png'
await db1.add_photo_path(photo_p, call.from_user.id)
all_show_basket = await db1.show_all_basket(call.from_user.id)
final_show_basket = all_show_basket[: -1]
show_start_image = await db1.select_photo_path(call.from_user.id)
price = sum(all_price[6] for all_price in final_show_basket)
if len(final_show_basket) == 0:
await call.message.answer('В корзине пока нет товаров(\n'
'Заказывайте скорее!', reply_markup=menu_inline_order)
else:
global list_full_basket
text = ''.join(f'{all_sh[3]}@'
f'Имя пользователя: {all_sh[2]}'
' '
f'Трек номер: {all_sh[9]}'
' '
f'Ссылка на товар: {all_sh[5]}'
' '
f'Цена: {all_sh[6]} рублей '
' '
f'Размер: {all_sh[7]} EU'
' '
f'Доставка: {all_sh[8]}'
' '
f'Номер телефона: {all_sh[9]}@' for all_sh in final_show_basket)
start_text = ''.join(f'{start_price[0]}@'
f'В вашей корзине: {len(final_show_basket)} товаров'
' '
f'На обшую сумму: {price} рублей' for start_price in show_start_image)
show_list = start_text.split('@')
up_show_list_basket = [show_list[u:u + 2] for u in range(0, len(show_list), 2)]
up_list_basket = text.split('@')
res_list_basket = [up_list_basket[b:b + 2] for b in range(0, len(up_list_basket), 2)]
final_list_basket = res_list_basket[: -1]
list_full_basket = up_show_list_basket + final_list_basket
messag = await call.message.answer_photo(photo=FSInputFile(path=list_full_basket[0][0]),
caption=f'{list_full_basket[0][1]}',
reply_markup=keyboards.paginator_basket_start())
list_messag.append(str(messag.message_id))
Вот код пагинации
class Basket(CallbackData, prefix='pag_basket'):
action: str
page: int
def paginator_basket_start(page: int = 0):
builder = InlineKeyboardBuilder()
builder.row(
InlineKeyboardButton(text='⬅️', callback_data=Basket(action='prev_basket', page=page).pack()),
InlineKeyboardButton(text='➡️️', callback_data=Basket(action='next_basket', page=page).pack())
)
builder.row(
InlineKeyboardButton(text='✅Оплатить товары', callback_data=Basket(action='pay_basket', page=page).pack()),
InlineKeyboardButton(text='❤️Меню', callback_data='menu'),
width=1
)
return builder.as_markup()
def paginator_basket(page: int = 0):
builder = InlineKeyboardBuilder()
builder.row(
InlineKeyboardButton(text='⬅️', callback_data=Basket(action='prev_basket', page=page).pack()),
InlineKeyboardButton(text='➡️️', callback_data=Basket(action='next_basket', page=page).pack())
)
builder.row(
InlineKeyboardButton(text='✅Оплатить товары', callback_data=Basket(action='pay_basket', page=page).pack()),
InlineKeyboardButton(text='❌Удалить этот товар из корзины', callback_data=Basket(action='delete_basket', page=page).pack()),
InlineKeyboardButton(text='❤️Меню', callback_data='menu'),
width=1
)
return builder.as_markup()
За грязь в коде извиняюсь, я не волшебник я только учусь