ListGroup

ListGroup is more complex way to render widgets for list of items. While Select generates simple buttons, with ListGroup you can create any set of keyboard widgets and repeat them.

To identity item inside keyboard event you can check dialog_manager.item_id. This is possible because SubManager is passed instead of DialogManager while corresponding widget is located inside ListGroup.

To find widget for specific item_id in a ListGroup, you can use the .find_for_item method from ManagedListGroup.

Manager methods:

  • .find: if manager already adapted for current ListGroup row, finds the widget within the current manager (SubManager).

  • .find_in_parent: if you need to find widgets outside the row, finds the widget within the parent manager (DialogManager).

Note

If you nest a ListGroup in ListGroup your parent manager will be SubManager

Code example:

from aiogram import F
from aiogram.filters.state import State, StatesGroup
from aiogram_dialog import (
    Window,
    Dialog,
)
from aiogram_dialog.widgets.kbd import (
    Url,
    ListGroup,
    SwitchTo,
    Back,
)
from aiogram_dialog.widgets.text import Const, Format


class SG(StatesGroup):
    main = State()
    result = State()


success = F["products"]
fail = ~success


async def actions(**kwargs):
    products = [
        {"id": 1, "name": "Ferrari", "category": "car",
         "url": "https://www.ferrari.com/"},
        {"id": 2, "name": "Detroit", "category": "game",
         "url": "https://wikipedia.org/wiki/Detroit:_Become_Human"},
    ]
    return {
        "products": products,
    }


dialog = Dialog(
    Window(
        Const("Click find products to show a list of available products:"),
        SwitchTo(Const("Find products"), id="search", state=SG.result),
        state=SG.main,
    ),
    Window(
        Const("Searching results:", when=success),
        Const("Search did not return any results", when=fail),
        ListGroup(
            Url(
                Format("{item[name]} ({item[category]})"),
                Format("{item[url]}"),
                id="url",
            ),
            id="select_search",
            item_id_getter=lambda item: item["id"],
            items="products",
        ),
        Back(Const("Back")),
        state=SG.result,
        getter=actions,
    )
)
class aiogram_dialog.widgets.kbd.ListGroup(*buttons, id, item_id_getter, items, when=None)
Parameters:
  • buttons (Keyboard)

  • id (str)

  • item_id_getter (Callable[[Any], str | int])

  • items (str | Callable[[Dict], Sequence] | MagicFilter | Sequence)

  • when (str | MagicFilter | Predicate | None)

__init__(*buttons, id, item_id_getter, items, when=None)
Parameters:
  • buttons (Keyboard)

  • id (str)

  • item_id_getter (Callable[[Any], str | int])

  • items (str | Callable[[Dict], Sequence] | MagicFilter | Sequence)

  • when (str | MagicFilter | Predicate | None)

class aiogram_dialog.widgets.kbd.ManagedListGroup(widget, manager)
Parameters:
  • widget (W)

  • manager (DialogManager)

find_for_item(widget_id, item_id)

Find widget for specific item_id.

Parameters:
  • widget_id (str)

  • item_id (str)

Return type:

Any | None

class aiogram_dialog.manager.sub_manager.SubManager(widget, manager, widget_id, item_id)
Parameters:
  • widget (Widget)

  • manager (DialogManager)

  • widget_id (str)

  • item_id (str)