使用ipyaggrid自定义单元格渲染器遇序列化错误的解决求助
问题原因
你在columnDefs中直接传入了Python函数currency_renderer作为cellRenderer,但ipyaggrid需要将grid_options序列化为JSON格式传递给前端AG Grid组件,而Python函数属于不可序列化的对象,因此触发了TypeError。另外,AG Grid的cellRenderer本质是前端JavaScript逻辑,无法直接执行Python函数。
修复方案
推荐使用AG Grid的valueFormatter(更适合纯值格式化场景),将格式化逻辑写成可序列化的JavaScript函数字符串,替代Python函数。修改后的代码如下:
def create_aggrid(df): currency_columns = ['size', 'pnl', 'commission'] column_defs = [ { 'headerName': column, 'field': column, # 使用JS的valueFormatter实现货币格式化,支持JSON序列化 'valueFormatter': 'params => "£" + parseFloat(params.value).toFixed(2)' if column in currency_columns else None } for column in df.columns ] grid_options = { 'columnDefs' : column_defs, 'defaultColDef': {'sortable': True, 'filter': True, 'resizable': True}, } ag_grid = grid.Grid(grid_data=df, export_mode="buttons", columns_fit='auto', grid_options=grid_options, theme='ag-theme-balham', keep_multiindex=False, center=True) return ag_grid
额外说明
- 若你确实需要自定义DOM渲染(而非仅格式化值),可以将
cellRenderer写成完整的JavaScript函数字符串:
'cellRenderer': 'function(params) { return `<span style="color:green">£${parseFloat(params.value).toFixed(2)}</span>`; }'
- 原代码中
defaultColDef里的'sortable': 'true'等布尔值不需要加引号,直接写True即可,JSON序列化时会自动转为正确的布尔类型。
内容的提问来源于stack exchange,提问作者Alesya
相关产品推荐
相关产品推荐

