You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:45:11