Streamlit动态表单:如何正确添加并精准移除text_input字段?
解决Streamlit动态表单字段删除问题
你的代码核心问题是删除按钮没有传递对应字段的标识,而且依赖全局列表和fields_size管理字段的方式,无法准确追踪要删除的目标输入框。下面是修复后的完整代码:
import streamlit as st # 初始化会话状态 if "field_keys" not in st.session_state: # 用列表存储每个字段的唯一key,初始包含第一个字段 st.session_state.field_keys = ["field_0"] def add_field(): # 生成新的唯一key,基于当前列表长度 new_key = f"field_{len(st.session_state.field_keys)}" st.session_state.field_keys.append(new_key) def delete_field(target_key): # 移除指定key的字段 if target_key in st.session_state.field_keys: st.session_state.field_keys.remove(target_key) st.header("Dynamic form ⚒️") st.divider() # 遍历所有字段key,渲染输入框和删除按钮 for key in st.session_state.field_keys: # 从key中提取序号,用于显示标签 field_num = key.split("_")[-1] c1, c2 = st.columns(2) with c1: st.text_input(f"Field {field_num}", key=key, label_visibility="visible") with c2: # 用lambda传递当前key给删除函数 st.button("❌", key=f"delete_{key}", on_click=delete_field, args=(key,)) st.button("➕ Add field", on_click=add_field)
关键修改点:
- 用
field_keys列表管理字段:每个字段对应一个唯一的key,存储在会话状态中,添加/删除操作直接操作这个列表,避免依赖fields_size的模糊计数。 - 删除按钮传递目标key:通过
lambda函数将当前字段的key作为参数传给delete_field函数,确保删除的是点击按钮对应的字段。 - 移除全局变量:不再使用
FIELDS和DELETES全局列表,直接通过会话状态和字段key渲染组件,避免状态不一致问题。
内容的提问来源于stack exchange,提问作者Hassane KA
相关产品推荐
相关产品推荐

