Example : A standard basic Form in Streamlit with various Validations.
import time
import streamlit as st
import re
from datetime import date
from sqlalchemy import create_engine, text

# Database connectivity code using SQLAlchemy technique
engine = create_engine("mysql+pymysql://root:@localhost/cakebake")
# st.success("Database Connected Successfully")

st.title("User Registration Form")

with st.form("form1"):
    # This regex allows strictly letters (uppercase and lowercase) and limits the input length to 20.
    name1 = st.text_input("Enter Your Name (Only letters, max 20 characters)", key="name2")
    # Validate the input using regular expression
    if name1:
        if not re.fullmatch(r"[A-Za-z ]{1,20}", name1):
            st.error("Invalid name entry: only letters allowed, and of max 20 characters.")
        # No error message if input is valid

    # Mobile number input (10-digit)
    mob1 = st.number_input("Enter Your Mobile Number(10 digits)", key="mob2", min_value=0, max_value=9999999999, step=1)
    if len(str(mob1)) > 10:
        st.error("Mobile number must be at most of 10 digits.")

    email1 = st.text_input("Enter Your Email", key="email2")
    if email1:
        # A simple regex: any non-@ chars, then an @, then non-@ chars, a dot, then non-@ chars.
        if not re.fullmatch(r"[^@]+@[^@]+\.[^@]+", email1):
            st.error("Invalid email format. Please enter a valid email address.")

    #gender1 = st.radio("Select Your Gender", ["Male", "Female", "Transgender"], key="gender2") # Male is By default selected
    gender1 = st.radio("Select Your Gender", ["Male", "Female", "Transgender"], index= 1, key="gender2") # Female is By default selected
    passwd1 = st.text_input("Enter Password", type="password", key="passwd2")
    if passwd1:
        # This regex ensures: 8-30 characters, at least one lowercase, one uppercase, one digit, and one special symbol (@$!%*#?&)
        if not re.fullmatch(r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,30}$", passwd1):
            st.error(
                "Invalid password. It must be 8-30 characters long, include at least one lowercase letter, one uppercase letter, one number, and one special symbol (@$!%*#?&).")

    addr1 = st.text_area("Enter Your Address", height=150, max_chars=1000, key="addr2")
    dob1 = st.date_input("Choose Your Birth Date", key="dob2", value=date.today())

    nat1 = st.selectbox("Select Your Nationality", ('Choose One','India', 'USA', 'Nepal', 'Bhutan', 'Sri Lanka'), key="nat2")
    #nat1 = st.selectbox("Select Your Nationality", ('India', 'USA', 'Nepal', 'Bhutan', 'Sri Lanka'), key="nat2") # by default India is selected
    #nat1 = st.selectbox("Select Your Nationality", ('India', 'USA', 'Nepal', 'Bhutan', 'Sri Lanka'), index=1, key="nat2") # by default USA is selected

    #st.write("Choose Your Qualification")  None check box is selected
    #matric1 = st.checkbox("Matric", key="matric2")
    #inter1 = st.checkbox("Intermediate", key="inter2")
    #grad1 = st.checkbox("Graduation", key="grad2")

    st.write("Choose Your Qualification")
    matric1 = st.checkbox("Matric", key="matric2")
    inter1 = st.checkbox("Intermediate", value= True, key="inter2") # intermediate is selected by default
    grad1 = st.checkbox("Graduation", key="grad2")

    rem1 = st.text_input("Enter Your Remarks, if any", value="N/A", disabled=True, key="rem2")

    # Buttons in a row
    col1, col2, col3, col4, col5 = st.columns(5)
    with col1:
        submit1 = st.form_submit_button("Submit")
    with col2:
        reset1 = st.form_submit_button("Reset")
    with col3:
        delete1 = st.form_submit_button("Delete")
    with col4:
        update1 = st.form_submit_button("Update")
    with col5:
        exit1 = st.form_submit_button("Exit")

NB: This validation will work when we click 'Submit' Button.
Example : A standard basic form in Streamlit with various validations and compulsory data filled out.
import time
import streamlit as st
import re
from datetime import date
from sqlalchemy import create_engine, text

# Database connectivity code using SQLAlchemy technique
engine = create_engine("mysql+pymysql://root:@localhost/cakebake")
# st.success("Database Connected Successfully")

st.title("User Registration Form")

with st.form("form1"):
    # This regex allows strictly letters (uppercase and lowercase) and spaces, and limits to max 20 characters.
    name1 = st.text_input("Enter Your Name (Only letters, max 20 characters)", key="name2")
    # Validate the input using regular expression
    if name1 and not re.fullmatch(r"[A-Za-z ]{1,20}", name1):
        st.error("Invalid name entry: only letters allowed, and of max 20 characters.")

    # Mobile number input (10-digit)
    mob1 = st.number_input("Enter Your Mobile Number (10 digits)", key="mob2", min_value=0, max_value=9999999999, step=1)

    # Email validation (Must match standard email format)
    email1 = st.text_input("Enter Your Email", key="email2")
    if email1 and not re.fullmatch(r"[^@]+@[^@]+\.[^@]+", email1):
        st.error("Invalid email format. Please enter a valid email address.")

    # Radio for Gender with no default valid selection.
    # A placeholder "Select Gender" is added to force the user to choose an option.
    gender_options = ["Select Gender", "Male", "Female", "Transgender"]
    gender1 = st.radio("Select Your Gender", gender_options, key="gender2")
    # Original (default) code:
    # gender1 = st.radio("Select Your Gender", ["Male", "Female", "Transgender"], key="gender2") # Male is By default selected
    # gender1 = st.radio("Select Your Gender", ["Male", "Female", "Transgender"], index=1, key="gender2") # Female is By default selected

    # Password validation (Must include uppercase, lowercase, number, special symbol; length 8-30)
    passwd1 = st.text_input("Enter Password", type="password", key="passwd2")
    if passwd1 and not re.fullmatch(
        r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,30}$",
        passwd1,
    ):
        st.error(
            "Invalid password. It must be 8-30 characters long, include at least one lowercase letter, one uppercase letter, one number, and one special symbol (@$!%*#?&)."
        )

    # Address input (Limited to 1000 characters)
    addr1 = st.text_area("Enter Your Address", height=150, max_chars=1000, key="addr2")

    # Date of Birth selection
    dob1 = st.date_input("Choose Your Birth Date", key="dob2", value=date.today())

    # Nationality selection (forcing user to select a valid option)
    nat1 = st.selectbox("Select Your Nationality", ('Choose One', 'India', 'USA', 'Nepal', 'Bhutan', 'Sri Lanka'), key="nat2")
    # nat1 = st.selectbox("Select Your Nationality", ('India', 'USA', 'Nepal', 'Bhutan', 'Sri Lanka'), key="nat2") # by default India is selected
    # nat1 = st.selectbox("Select Your Nationality", ('India', 'USA', 'Nepal', 'Bhutan', 'Sri Lanka'), index=1, key="nat2") # by default USA is selected

    # Qualification Selection using Checkboxes with no default selection.
    st.write("Choose Your Qualification")
    # None of the checkboxes is selected initially.
    # matric1 = st.checkbox("Matric", key="matric2")
    # inter1 = st.checkbox("Intermediate", key="inter2")
    # grad1 = st.checkbox("Graduation", key="grad2")
    matric1 = st.checkbox("Matric", key="matric2")
    inter1 = st.checkbox("Intermediate", key="inter2")
    grad1 = st.checkbox("Graduation", key="grad2")

    # Remarks input (Disabled)
    rem1 = st.text_input("Enter Your Remarks, if any", value="N/A", disabled=True, key="rem2")

    # Buttons in a row
    col1, col2, col3, col4, col5 = st.columns(5)
    with col1:
        submit1 = st.form_submit_button("Submit")
        if submit1:
            errors = []
            # Validate Name Field
            if not name1.strip():
                errors.append("⚠️ Name is required.")
            # Validate Mobile Number: check for exactly 10 digits
            if len(str(mob1)) != 10:
                errors.append("⚠️ Mobile number must be exactly 10 digits.")
            # Validate Email Field
            if not email1.strip():
                errors.append("⚠️ Email is required.")
            elif not re.fullmatch(r"[^@]+@[^@]+\.[^@]+", email1):
                errors.append("⚠️ Invalid email format.")
            # Validate Gender: ensure the placeholder is not selected
            if not gender1 or gender1 == "Select Gender":
                errors.append("⚠️ Gender is required.")
            # Validate Password Field
            if not passwd1.strip():
                errors.append("⚠️ Password is required.")
            elif not re.fullmatch(
                r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,30}$",
                passwd1,
            ):
                errors.append("⚠️ Password does not meet security requirements.")
            # Validate Address Field
            if not addr1.strip():
                errors.append("⚠️ Address is required.")
            # Validate Nationality: force selection of a valid option
            if nat1 == "Choose One":
                errors.append("⚠️ Please select a nationality.")
            # Optionally, ensure at least one qualification is selected
            if not (matric1 or inter1 or grad1):
                errors.append("⚠️ At least one qualification must be selected.")

            if errors:
                for err in errors:
                    st.warning(err)
            else:
                st.success("✅ Form submitted successfully!")

    with col2:
        reset1 = st.form_submit_button("Reset")
    with col3:
        delete1 = st.form_submit_button("Delete")
    with col4:
        update1 = st.form_submit_button("Update")
    with col5:
        exit1 = st.form_submit_button("Exit")

NB: This validation and filled Confirmation will work when we click 'Submit' Button.

Loading

Categories: Streamlit

0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.