Dash回调根据Material下拉选择动态更新Batch下拉选项问题求解
问题根因
- 物料下拉框
material_dd组件未设置初始可选值,对应的回调仅监听搜索值变化,用户未主动搜索时无法正常选中物料值,导致后续Batch联动回调触发时material_dd始终为None - Batch联动回调中筛选批次使用了全量数据集
df,但全局批次列表是从过滤后的溶出数据集df_dis中提取的,且全量df的Material字段未做缺失值填充,匹配时容易出现不命中的情况 basis_dd的回调存在参数笔误,输入为basis_dd的搜索值,函数参数却命名为batch_dd,返回格式也不符合Dropdown要求的{'label':'xxx','value':'xxx'}结构,会导致该下拉框异常
修复方案
- 给
material_dd组件添加初始可选值,删除多余的仅监听搜索值的物料选项回调 - 修正Batch联动回调的筛选数据源为
df_dis,和全局批次列表的数据源保持一致 - 修正
basis_dd的回调逻辑,适配Dropdown的返回格式要求
修正后的核心代码
组件部分修改
# 物料下拉框新增初始options配置 html.Div([ html.Div(children='''Material: '''), dcc.Dropdown( id='material_dd', multi=False, clearable=True, disabled=False, options=[{'label': i, 'value': i} for i in material] # 新增本行 ), ],style = {'width': '15%','display': 'inline-block'} ),
回调部分修改
# 删除原有的material_dd options回调,直接用组件初始配置即可 @app.callback( Output('batch_dd','options'), Input('material_dd','value') # 无需自定义搜索逻辑可删除batch_dd的search_value输入 ) def batch_options(material_dd): if material_dd is None: return [{'label': i, 'value': i} for i in batch] else: # 筛选数据源改为df_dis,和全局批次的数据源保持一致 batch_df = df_dis[df_dis['Material']==material_dd] return [{'label':i,'value':i} for i in batch_df['Batch'].fillna('None').unique()] # 修正basis_dd回调逻辑示例(按需调整) @app.callback( Output('basis_dd','options'), Input('batch_dd','value') ) def get_basis(batch_dd): if not batch_dd: return [{'label': i, 'value': i} for i in basis] batch_df = df_dis[df_dis['Batch']==batch_dd] return [{'label':i,'value':i} for i in batch_df['Basis'].fillna('None').unique()]
内容的提问来源于stack exchange,提问作者Raghav Chamadiya
相关产品推荐
相关产品推荐

