[英]dash_table.DataTable persistence not compatible with navlinks
在多頁 Dash 應用程序中的應用程序之間切換后,我試圖在dash_table.DataTable
中保留值。 我已經嘗試過使用navlinks
(下面的示例代碼)、 pages
(破折號 2.5)和tabs
。 我想使用 persistence 參數而不是dcc.Store
和navlinks/pages
而不是tabs
來做到這一點。
即使設置為“會話”或“本地”,刷新頁面似乎也會覆蓋持久性關鍵字,因為使用選項卡可以解決此問題(選項卡不會刷新頁面)。 我也試過dcc.Location
與refresh=False
沒有成功。 我制作了一個小示例代碼來顯示我的問題。 從我的打印語句中,您還可以觀察到在鏈接/頁面之間切換后數據被重置為'None'
。
import pandas as pd
import numpy as np
from dash import Dash, callback, html, dcc, dash_table, Input, Output, dash_table, callback_context as ctx
import dash_bootstrap_components as dbc
df = pd.DataFrame({'test1':np.zeros(3), 'test2':np.zeros(3)})
def get_data():
return df
app = Dash(external_stylesheets=[dbc.themes.BOOTSTRAP], suppress_callback_exceptions= True)
app.layout = dbc.Container([
dcc.Location(id = 'url', refresh = False),
dbc.Row(
dbc.Navbar(
dbc.Nav(children=[
dbc.NavItem(dbc.NavLink("Main", active='exact', external_link=False, href='/'), id = 'main'),
dbc.NavItem(dbc.NavLink("A link", active = 'exact', external_link=False, href="/link"), id = 'alink')
])
)
),
html.Div(id = 'link')
])
main = html.Div([
dbc.Row(
dbc.Col([
dbc.Button("test1 +1", id='btn1', className="me-2", n_clicks = 0),
dbc.Button("test2 +1", id='btn2', className="me-2", n_clicks = 0)
])
),
dbc.Row([
dbc.Col(
dash_table.DataTable(columns = [{'name': x, 'id':x} for x in get_data().columns],
id = 'table',
persistence = True,
persisted_props = ['data'],
persistence_type = 'session')
)
])
])
@app.callback(
Output('link', 'children'),
Input('url', 'pathname')
)
def render_page(path):
print(path)
if path != '/':
layout = html.Div(
dbc.Row(
html.H5(path)
)
)
else:
layout = main
return layout
@app.callback(
Output('table', 'data'),
[
Input('table', 'data'),
Input("btn1", "n_clicks"),
Input("btn2", "n_clicks")
]
)
def render_table(data,b1,b2):
print("Data: ", data)
if data == None:
return get_data().to_dict('records')
df = pd.DataFrame(data)
button_id = ctx.triggered[0]["prop_id"].split(".")[0]
if button_id == 'btn1':
df['test1'] += 1
elif button_id == 'btn2':
df['test2'] += 1
return df.to_dict('records')
app.run_server()
每次該pathname
觸發第一個回調並將應用程序定向到主頁時,您的 DataTable 都會重置為代碼開頭定義的df
。 這就是為什么簡單地設置表持久性沒有幫助,您每次都是從零開始創建它。
如果您不想使用 dcc.Store,您只需創建一次表並使用pathname
觸發來決定是否顯示該表。 這就是我對您的代碼所做的,我在主布局中定義了表格,當url
不在主頁中時,為表格父 div 傳遞了一個{'display': 'none'}
參數。
import pandas as pd
import numpy as np
from dash import Dash, callback, html, dcc, dash_table, Input, Output, dash_table, callback_context as ctx
import dash_bootstrap_components as dbc
df = pd.DataFrame({'test1':np.zeros(3), 'test2':np.zeros(3)})
def get_data():
return df
app = Dash(external_stylesheets=[dbc.themes.BOOTSTRAP], suppress_callback_exceptions= True)
app.layout = dbc.Container([
dcc.Location(id = 'url', refresh = False),
dbc.Row(
dbc.Navbar(
dbc.Nav(children=[
dbc.NavItem(dbc.NavLink("Main", active='exact', external_link=False, href='/'), id = 'main'),
dbc.NavItem(dbc.NavLink("A link", active = 'exact', external_link=False, href="/link"), id = 'alink')
])
)
),
html.Div(id = 'link'),
html.Div(id = 'table_div', children = [
dbc.Row(
dbc.Col([
dbc.Button("test1 +1", id='btn1', className="me-2", n_clicks = 0),
dbc.Button("test2 +1", id='btn2', className="me-2", n_clicks = 0)
])
),
dbc.Row([
dbc.Col(
dash_table.DataTable(columns = [{'name': x, 'id':x} for x in get_data().columns],
id = 'table',
persistence = True,
persisted_props = ['data'],
persistence_type = 'session')
)
])
])
])
@app.callback(
Output('link', 'children'),
Output('link', 'style'),
Output('table_div', 'style'),
Input('url', 'pathname')
)
def render_page(path):
print(path)
if path != '/':
layout = html.Div(
dbc.Row(
html.H5(path)
)
)
return layout, {'display': ''}, {'display': 'none'}
else:
# layout = main
return [], {'display': 'none'}, {'display': ''}
@app.callback(
Output('table', 'data'),
[
Input('table', 'data'),
Input("btn1", "n_clicks"),
Input("btn2", "n_clicks")
]
)
def render_table(data,b1,b2):
print("Data: ", data)
if data == None:
return get_data().to_dict('records')
df = pd.DataFrame(data)
button_id = ctx.triggered[0]["prop_id"].split(".")[0]
if button_id == 'btn1':
df['test1'] += 1
elif button_id == 'btn2':
df['test2'] += 1
return df.to_dict('records')
app.run_server()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.