Задать вопрос
@Egor12347

Как реализовать кнопку удаления из корзины в пагинации?

У меня есть пагинация корзины которая динамически изменяется при нажатии на кнопки, все данные достаются из бд, единственное я не могу реализовать кнопку удалить товар из корзины, сами данные товара удаляются из списка, но в '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()


За грязь в коде извиняюсь, я не волшебник я только учусь
  • Вопрос задан
  • 70 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы