Dynamic Page Content Loading without a Multi-Page App

Summary

Dynamic Page Content Loading without a Multi-Page App

Without using a multi-page appā€¦

My sidebar contains a dynamically generated menu. Each item is a link to a page that resides in a subfolder. (Example: /demo-pages/page.py) (Also see visual explanation at link below)

Originally, I had a multipage app, but needed a search box, where I could type and it would filter the page contents list. I now have that working great.

When I click a link, I need itā€™s code to load into the page, maintaining the sidebar. I looked into iframes, but couldnā€™t really see how to use session state variables to dynamically reload the iframeā€™s contents / src. It would load the initial page, but then it wouldnā€™t register a reload of the src when a link was clicked.

Tabs wonā€™t work as each page to load is pretty much itā€™s own app. I know I could fiddle with session state, for maintaining where the sidebar search list was currently at based on user input. That would require placing the code on each sub page already created (a lot of them) and new users to adopt new code into their workflow.

I tried to see if there was a templating system where I could specify a placeholder ā€œsectionā€ or ā€œcontainerā€ that the content would automatically load into, but couldnā€™t find anything.

I did a search of the forum and googled a lot, but for better or worse, didnā€™t come up with any answers, so I wanted to post here.

Visual Explanation

Link:
https://app-apps-zxxkvnjd9ufapp7wwq3kspi.streamlit.app/

Keywords/Phrases that I couldnā€™t find in the tags that may help future forum searches:

  • dynamic content loading
  • dynamic content rendering
  • dynamic iframe reloading
  • sidebar menu without multipage app

There are a few ways you might try and go about that. Is there a specific reason you donā€™t want to use a multipage app? The first way that comes to mind is something like this:

import streamlit as st


def page_1():
    st.write("Page 1")


def page_2():
    st.write("Page 2")


if st.sidebar.button("Page 1"):
    page_1()

if st.sidebar.button("Page 2"):
    page_2()

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