Python Plotly Dash : 如何在回调后插入新值进行过滤? (更新过滤器)

Python Plotly Dash : How to insert new values to filter after the callback? (Update filter)

我的情况是 user_id 只有在他登录后我才得到 table。

例如:

app = dash.Dash(__name__)

#Filter with static values
Month_Selector = dcc.Dropdown(id='month_dropdown',
                                  options=[
                                      {"label": "November 2021", "value": "November 2021"},
                                      {"label": "October 2021", "value": "October 2021"},
                                      {"label": "September 2021", "value": "September 2021"},
                                  ],
                                          placeholder="Select Month",
                                          value = datetime.today().strftime('%B %Y'),
                                          searchable=False
                                          )

app.layout = html.Div(
    children=[
    html.Div(Month_Selector, style={'width': '200px'}),
    dcc.Graph(id='chart')
    ]
)


    @dash_app.callback(
        [
        Output(component_id='chart', component_property='figure')
        ],
        [Input(component_id="submit-button-state", component_property="n_clicks"),
         Input(component_id="month_dropdown", component_property="value")]
    )
    def get_user_name(n_clicks, selected_month):
        
        # Can get a table only after user authorization.
        df= get_table_by_an_authorized_user_id
        
        #filter table by slicer value
        filtered_df= df[ (df['Month Name'] == selected_month)]
        
        # This new values that need to insert to slicer Month_Selector
        new_options_for_month_selector=[{'label': i, 'value': i} for i in df['Month Name'].unique()]
        
        fig = px.bar(filtered_df, x='Month Name', y='Sales')
        return fig
    # Run Local Server
if __name__ == '__main__':
    app.run_server(debug=True, use_reloader=False)    

因此在@callback 之前我只能使用过滤静态值。 如何使用 @callback 后获得的动态值更新或替换过滤器值?

您想更新下拉列表的 options 属性,因此您可以使用新选项添加​​ Output 并进行回调 return 他们连同更新后的数字:

@dash_app.callback(
    [Output(component_id='chart', component_property='figure'),
     Output(component_id='month_dropdown', component_property='options')],
    [Input(component_id="submit-button-state", component_property="n_clicks"),
     Input(component_id="month_dropdown", component_property="value")]
)
def get_user_name(n_clicks, selected_month):
    
    # Can get a table only after user authorization.
    df= get_table_by_an_authorized_user_id
    
    #filter table by slicer value
    filtered_df= df[ (df['Month Name'] == selected_month)]
    
    # This new values that need to insert to slicer Month_Selector
    new_options_for_month_selector=[{'label': i, 'value': i} for i in df['Month Name'].unique()]
    
    fig = px.bar(filtered_df, x='Month Name', y='Sales')
    return [fig, new_options_for_month_selector]