Skip to content

Instantly share code, notes, and snippets.

@yechielb2000
Last active August 8, 2024 12:06
Show Gist options
  • Save yechielb2000/6f0c67d97330b283d7edb6cefa63ca3c to your computer and use it in GitHub Desktop.
Save yechielb2000/6f0c67d97330b283d7edb6cefa63ca3c to your computer and use it in GitHub Desktop.
For Streamlit users: This is a way to take your pydantic model and make it a form, your welcome <3
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
import streamlit as st
def generic_form(model: BaseModel, model_name: str) -> st.form:
form = st.form(key=f'form_{model_name}')
if model_name not in st.session_state:
model_params = {k: None for k in model.model_fields.keys()}
model_params.pop('id', '')
st.session_state[model_name] = model_params
form.json(st.session_state[model_name])
for field_name, field_info in model.model_fields.items():
description = field_info.description
field_type = field_info.annotation
if field_name == "id":
continue
if field_type == datetime:
date_obj, time_obj = form.columns(2, vertical_alignment='bottom')
date_obj = date_obj.date_input(description, value='today')
time_obj = time_obj.time_input(description, label_visibility='collapsed')
st.session_state[model_name][field_name] = datetime.combine(date_obj, time_obj)
elif field_type == str:
st.session_state[model_name][field_name] = form.text_input(
description, value=st.session_state[model_name][field_name])
elif field_type == int:
st.session_state[model_name][field_name] = form.number_input(
description,
value=st.session_state[model_name][field_name],
format="%d",
step=1
)
elif field_type == bool:
st.session_state[model_name][field_name] = form.checkbox(
description,
value=st.session_state[model_name][field_name]
)
elif field_type == Optional[int]:
st.session_state[model_name][field_name] = form.number_input(
description,
format="%d",
step=1,
value=st.session_state[model_name][field_name],
min_value=0,
max_value=999999,
help="Optional"
)
elif field_type == Optional[str]:
st.session_state[model_name][field_name] = form.text_input(
description,
value=st.session_state[model_name][field_name],
help="Optional"
)
return form
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment