Last active
August 8, 2024 12:06
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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