Quantcast
Channel: 🎛️ Dash - Plotly Community Forum
Viewing all articles
Browse latest Browse all 6271

TypeError: unhashable type: 'dict' in dash app with pattern matching callbacks

$
0
0

Hello. I have only been using Dash a few weeks and I’m now trying pattern matching callbacks. My app works completely fine as a standalone app (not sure if this is the correct terminology), but returns TypeError: unhashable type: ‘dict’ when integrating it into my Django project as a stateless Django app.

There appears to be 2 problems:

  1. Appears to be with the app.layout (it doesn’t seem to like me specifying the id for the dropdown as a dictionary)
  2. The pattern matching callbacks (e.g. ALL from dash.dependencies) does not work in DjangoDash (TypeError: list indices must be integers or slices, not str). But again works fine standalone in app = dash.Dash

BUT, everything works fine if I use

app = dash.Dash( __name__, external_stylesheets=["https://codepen.io/chriddyp/pen/bWLwgP.css"]
 )

But not with

app = DjangoDash('ABS_6291_0_55_003', external_stylesheets= ['https://codepen.io/childdyp/pen/bWLwgP.css'], suppress_callback_exceptions=True)

My app.layout::

external_stylesheets = ['https://codepen.io/childdyp/pen/bWLwgP.css']
app = DjangoDash('ABS_6291_0_55_003', external_stylesheets=external_stylesheets, suppress_callback_exceptions=True)

app.layout = html.Div(
    [
        html.H1("App title"),
        html.Div([
            html.A(
                id='excel-download',
                download="data.xlsx",
                children=[html.Button("Download Excel data", id="download-btn")],
                href="",
                target="_blank"
            )
        ], style={"width": "25%", "float": "right"}),
        html.Div([
            html.Div(children=
                [
                    html.P(["Select table:", dcc.Dropdown(id={'type': 'filter-dropdown',
                                                              'dimension': 'Select'},
                                                          options=[{'label': d, 'value': d} for d in select_table_options],
                                                          value=select_table_options[0],
                                                          clearable=False
                                                          )])
                ],
            ),
            html.Div(children=
                [
                    html.P(["Show all:", dcc.Dropdown(id={'type': 'filter-dropdown',
                                                          'dimension': 'Show'},
                                                      options=[{'label': 'None', 'value': 'None'}],
                                                      value=None, clearable=True
                                                      )])
                ],
            ),

            html.Div(id='dropdown-container-output'),
        ], style={"width": "25%", "float": "left"}),
        dcc.Graph(id="graph", style={"width": "75%", "display": "inline-block"})
    ]
)

I generate some extra drop down menus, which are dependent on one of the ‘Select’ dropdown specified above:

@app.callback(
    Output('dropdown-container-output', 'children'),
    [Input({'type': 'filter-dropdown', 'dimension': 'Select'}, 'value')]
)
def display_output(select):
    """ Show dropdown menus, only if they have data for the table selected """
    data_filtered = dataset.to_table(filter=ds.field('Table') == select, columns=dimensions).to_pandas()

    non_null_columns = [col for col in data_filtered.columns if data_filtered.loc[:, col].notna().any()]

    all_options = []
    for d in non_null_columns:
        all_options.append(get_options_without_all(data_filtered[d].unique()))

    all_start_values = []
    for d in non_null_columns:
        options = data_filtered[d].sort_values()
        if options.isnull().values.any():
            all_start_values.append('None')
        else:
            all_start_values.append(options[0])

    return html.Div(
        [
            html.P([d + ":", dcc.Dropdown(id={'type': 'filter-dropdown', 'dimension': d},
                                          options=all_options[idx],
                                          value=all_start_values[idx],
                                          clearable=False,
                                          )])
            for idx, d in enumerate(non_null_columns)
        ],
    )

Then make a chart and excel file that goes something like this (i’ll spare you the function details as they don’t seem relevant), but they are dependent on both the dropdowns generated in the callback above and the ones generated in the app.layout:

@app.callback(Output(“graph”, “figure”),
[Input({‘type’: ‘filter-dropdown’, ‘dimension’: ALL}, ‘value’),
Input({‘type’: ‘filter-dropdown’, ‘dimension’: ALL}, ‘id’)])
def make_figure(values, names):

@app.callback(Output(‘excel-download’, ‘href’),
[Input({‘type’: ‘filter-dropdown’, ‘dimension’: ALL}, ‘value’),
Input({‘type’: ‘filter-dropdown’, ‘dimension’: ALL}, ‘id’)])
def download_xl(values, names):

This is the output I get:

Internal Server Error: /django_plotly_dash/app/ABS_6291_0_55_003/_dash-layout
Traceback (most recent call last):
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/views.py", line 68, in layout
    response_data, mimetype = app.augment_initial_layout(resp, initial_arguments)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 419, in augment_initial_layout
    reworked_data = self.walk_tree_and_replace(baseData, initial_arguments)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 461, in walk_tree_and_replace
    r = self.walk_tree_and_replace(v, overrides)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 461, in walk_tree_and_replace
    r = self.walk_tree_and_replace(v, overrides)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 466, in walk_tree_and_replace
    return [self.walk_tree_and_replace(x, overrides) for x in data]
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 466, in <listcomp>
    return [self.walk_tree_and_replace(x, overrides) for x in data]
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 461, in walk_tree_and_replace
    r = self.walk_tree_and_replace(v, overrides)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 461, in walk_tree_and_replace
    r = self.walk_tree_and_replace(v, overrides)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 466, in walk_tree_and_replace
    return [self.walk_tree_and_replace(x, overrides) for x in data]
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 466, in <listcomp>
    return [self.walk_tree_and_replace(x, overrides) for x in data]
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 461, in walk_tree_and_replace
    r = self.walk_tree_and_replace(v, overrides)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 461, in walk_tree_and_replace
    r = self.walk_tree_and_replace(v, overrides)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 466, in walk_tree_and_replace
    return [self.walk_tree_and_replace(x, overrides) for x in data]
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 466, in <listcomp>
    return [self.walk_tree_and_replace(x, overrides) for x in data]
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 461, in walk_tree_and_replace
    r = self.walk_tree_and_replace(v, overrides)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 461, in walk_tree_and_replace
    r = self.walk_tree_and_replace(v, overrides)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 466, in walk_tree_and_replace
    return [self.walk_tree_and_replace(x, overrides) for x in data]
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 466, in <listcomp>
    return [self.walk_tree_and_replace(x, overrides) for x in data]
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 461, in walk_tree_and_replace
    r = self.walk_tree_and_replace(v, overrides)
  File "/home/marco/anaconda3/envs/dashboard_project/lib/python3.7/site-packages/django_plotly_dash/dash_wrapper.py", line 456, in walk_tree_and_replace
    replacements = self._replacements.get(thisID, {})
TypeError: unhashable type: 'dict'
HTTP GET /django_plotly_dash/app/ABS_6291_0_55_003/_dash-layout 500 [0.13, 127.0.0.1:51644]

1 post - 1 participant

Read full topic


Viewing all articles
Browse latest Browse all 6271

Trending Articles