Skip to main content
📄 HTML & the platform·Module A3 · Lesson 6
TaskBuild a select with name='size' containing three options: small/medium/large. Mark medium as selected. Add a placeholder option with empty value '— pick —' first.

<select> + <option> + <optgroup>

75 XP7 min
Theory

Dropdowns — the most common form element you'll write

<select name="country">
  <option value="">— Pick one —</option>
  <option value="us">United States</option>
  <option value="ua">Ukraine</option>
  <option value="de" selected>Germany</option>
</select>
  • The value attribute is what gets submitted (country=de). The text inside is what the user sees.
  • selected on one option pre-selects it on first render.
  • The first option with an empty value works as a placeholder.

<optgroup> for categories

<select name="lang">
  <optgroup label="Latin">
    <option value="en">English</option>
    <option value="es">Spanish</option>
  </optgroup>
  <optgroup label="Cyrillic">
    <option value="ru">Russian</option>
    <option value="uk">Ukrainian</option>
  </optgroup>
</select>

The optgroup label is the bold category header in the dropdown.

multiple

<select multiple> lets the user pick 0+ options (Cmd/Ctrl+click). The submitted form data has the SAME name multiple times — lang=en&lang=es. FastAPI receives this as list[str] if typed correctly:

async def submit(lang: list[str] = Form()):
    return {"chosen": lang}   # ["en", "es"]

When NOT to use <select>

  • 2 options → use <input type="radio"> (visible immediately).
  • 50+ options → use a combobox / autocomplete (native datalist or a custom widget).
  • Search-like → <input list="…"> with a <datalist>.
🔒

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial — card required, cancel anytime.

Sign up — free trial →

First 10 lessons in each track are free. No card needed for those.

PreviousNext lesson →

Get one Python or web tip a day — by email

Short, hand-written, no spam. Unsubscribe in one click.