TL;DR
My python-fu is too weak to figure out how to retrieve my identifier from the “stringified dictionary with no whitespace” that is stored in dash.callback_context.triggered
for a MATCH input.
E.g. given that it contains
{"id":"example_input.csv","type":"job-delete-button"}.n_clicks
I’d like get my hands on example_input.csv
.
Best I can figure is to clip the .n_clicks
off the end and feed the remainder to json.loads
.
That’s leaving me feeing kind of dirty. Is there something more proper?
I’ve also discovert ast.literal_eval
as a possible solution. Is that any cleaner?
Details
I have a list of jobs in a dcc.Store. I have a callback (update_jobs
) that manages them. One input to that callback is a dcc.Upload that adds the new info to the jobs list and returns it as output.
I have callback (update_job_list
) that takes the jobs list’s data as input and generates a bunch of html.P’s that are output into a div.
That all works fine.
I’ve extended update_job_list
so that each P element also contains a button for the corresponding job, defined like so:
158 delete_button = html.Button(
159 id={"type": "job-delete-button", "id": j["filename"]}
160 )
where j["filename"]
is a unique identifier for that button.
I’ve add an input and matching parameter to update_jobs
like so:
118 Input({"type": "job-delete-button", "id": ALL}, "n_clicks"),
and whenever I click the button the update_jobs
callback triggers.
BUT I’m at a loss as to how to identify which button was pressed.
The prop_id
field of dash.callback_context.triggered
contains:
{"id":"example_input.csv","type":"job-delete-button"}.n_clicks
which the docs say is “a stringified dictionary with no whitespace”.
The only example that I can find is the ToDo app on the Pattern matching callbacks page, but the inputs it’s dealing with aren’t pattern matched.
How should I retrieve example_input.csv
from the string that’s store in triggered
? All of the solutions I’ve come up with are kind of whacky, e.g. trim .n_clicks
off the tail and then feed the string to json.loads
.
What’s The Right Way™?
ps. Thanks for making it this far…