Multi step form interaction

Hey all.

Is it possible to have something like a multi-step form, like a wizard?

The use case that I am developing this for is something like: (I use 3 different streamlit apps for this now)

I generate a story based on certain parameters.
I click submit, and it generates a storyline.
I can edit that storyline, and when I click submit, I am presented with another form, specifically to use that storyline to create a booklet.
That booklet generation has other parameters that you can set.
When iā€™m happy with that, I click ā€˜create bookā€™ and I am presented with, yet another form to work on the final parametersā€¦

All of these have to work independently of each other, so changing something doesnā€™t rerun the entire interface, only when I click submit (like a st.form) But, how would one add the functionality to show and hide form controls?

Does anyone know, am I perhaps asking a bit too much of Streamlit in this case?

Thank you all!

Hi @Marco_Kotrotsos,

Yes, this use case is doable with Streamlit, mainly through session state. Youā€™ll probably want to store the values of all the inputs in session state and have a variable in session state that indicates which of the steps have been completed by the user, so that when the app reruns after the user hits the ā€œSubmitā€ button on one of the forms, the next form can be displayed.

Hereā€™s an example of a skeleton app

import streamlit as st


def generate_storyline():
    st.session_state["stage"] = "edit_storyline"


def create_booklet():
    st.session_state["stage"] = "final_parameters"


def final_parameters():
    st.session_state["stage"] = "story_generation"


if "stage" not in st.session_state:
    st.session_state["stage"] = "story_generation"

if st.session_state["stage"] == "story_generation":
    with st.form("story_form"):
        submitted = st.form_submit_button(
            "Generate Storyline", on_click=generate_storyline
        )

elif st.session_state["stage"] == "edit_storyline":
    with st.form("edit_story_form"):
        submitted = st.form_submit_button("Create Booklet", on_click=create_booklet)

elif st.session_state["stage"] == "final_parameters":
    with st.form("final_params_form"):
        submitted = st.form_submit_button("Create Book", on_click=final_parameters)
2 Likes

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.