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

Streamlit多页应用列内使用表单提交按钮报错求助

解决Streamlit多页应用中列内表单提交的错误问题

错误原因

触发StreamlitValueAssignmentNotAllowedError的核心原因是:表单提交按钮的状态由Streamlit内部管理,不可通过st.session_state手动赋值;在多页应用场景下,若组件key重复或代码结构导致状态处理逻辑冲突,就会触发该错误。同时原代码未通过session_state持久化输入值,即使无错误也无法保留并显示提交后的新值。

解决方案1:使用session_state持久化值+唯一组件key

修改代码,通过st.session_state保存输入值,同时给组件设置唯一key避免多页冲突:

def first_page():
    col2, col3 = st.columns([6, 2])
    # 初始化session_state中的输入值
    if 'new_value' not in st.session_state:
        st.session_state.new_value = 0

    with col3:
        with st.form("test-form", clear_on_submit=False):
             # 绑定session_state的值作为输入框默认值,并设置唯一key
             st.number_input('New value', value=st.session_state.new_value, key='unique_input_key')
             submit = st.form_submit_button(label="Verwerk")

        if submit:
           # 更新session_state中的值并显示
           st.session_state.new_value = st.session_state.unique_input_key
           st.write(st.session_state.new_value)

解决方案2:将提交逻辑放入表单上下文内

如果不需要持久化输入值,仅需提交后临时显示,可将if submit的判断逻辑移至表单内部:

def first_page():
    col2, col3 = st.columns([6, 2])
    rekenprijs = 0

    with col3:
        with st.form("test-form"):
             new_value = st.number_input('New value', value=rekenprijs)
             submit = st.form_submit_button(label="Verwerk")
             # 提交逻辑放在表单上下文内
             if submit:
                 st.write(new_value)

说明

  • 方案1适合需要保留输入值的场景,确保页面刷新或切换后仍能维持之前的输入状态
  • 方案2适合临时展示提交结果的场景,简化代码结构

内容的提问来源于stack exchange,提问作者geert jaap Alma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:35:10