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
相关产品推荐
相关产品推荐

