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

如何在Dash中将动态创建的DataTable数据传入回调函数?

动态生成Dash DataTable的多表数据获取方案

问题背景

已通过以下代码动态生成5个可编辑的Dash DataTable:

@app.callback(Output(component_id="my-tables-out", component_property="children"))
def update_output_div():
    params = ["A", "B"]
    num_tables = 5
    result = []
    for i in range(5):
        table = dash_table.DataTable(
            id=f"table-{i}",
            columns=([{"id": p, "name": p} for p in params]),  # type: ignore
            data=[
                dict(**{param: None for param in params})  # type: ignore
                for i in range(num_species)
            ],
            editable=True,
        )
        result.append(table)
    return result

需要实现回调函数获取所有动态表的data数据,但不确定多动态表场景下Input的component_id如何指定,原尝试的回调框架如下:

@app.callback(
    Output("data", "children"),
    Input(component_id="table_<i>", component_property="data")
)
def display_output(rows, columns):
    pass

解决方案

方法1:显式声明所有动态表的Input

已知动态生成的表ID为table-0到table-4,可直接将每个表的data属性作为回调Input:

from dash import Input, Output, callback

@app.callback(
    Output("data", "children"),
    [Input(f"table-{i}", "data") for i in range(5)]
)
def display_output(*all_table_data):
    # all_table_data为元组,依次对应table-0到table-4的data数据
    table_data_dict = {f"table-{i}": data for i, data in enumerate(all_table_data)}
    # 可根据需求处理数据,比如转为字符串展示
    return str(table_data_dict)

该方法适合已知动态表数量的场景,代码直观,但表数量变化时需手动修改Input列表。

方法2:使用Pattern-Matching Callbacks(推荐)

若动态表数量不确定或后续可能变化,使用Dash模式匹配回调更灵活,需先修改动态表的ID格式,再用通配符匹配:

第一步:修改动态生成表的ID

@app.callback(Output(component_id="my-tables-out", component_property="children"))
def update_output_div():
    params = ["A", "B"]
    num_tables = 5
    result = []
    for i in range(5):
        table = dash_table.DataTable(
            id={"type": "dynamic-table", "index": i},  # 改为字典格式ID
            columns=([{"id": p, "name": p} for p in params]),
            data=[
                dict(**{param: None for param in params})
                for _ in range(num_species)  # 修复原代码变量名冲突问题
            ],
            editable=True,
        )
        result.append(table)
    return result

第二步:编写模式匹配回调

from dash import Input, Output, callback, ALL

@app.callback(
    Output("data", "children"),
    Input({"type": "dynamic-table", "index": ALL}, "data")
)
def display_output(all_table_data):
    # all_table_data为列表,元素顺序对应index从小到大的表数据
    table_data_dict = {f"table-{i}": data for i, data in enumerate(all_table_data)}
    return str(table_data_dict)

该方法无需关注具体表数量,所有type为dynamic-table的表都会被自动匹配,扩展性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:55:23