Placeholder
Introduction
Section titled “Introduction”Placeholder is a non-input field: it renders or-placeholder with a paragraph of content. Defaults _dehydrated = False so it does not participate in save payloads unless you call .dehydrated(True). Use .content() for static copy, or let state fill the paragraph when content is empty. Prefer View field when you need arbitrary HTML or callables.
Each variation below includes a detailed explanation, the fluent API to paste into your schema, and light/dark screenshots of the rendered control.
Basic placeholder
Section titled “Basic placeholder”Static instructional or summary text between real inputs.
Placeholder.make('billing_note') .content('Invoices are emailed on the 1st of each month.')

Content from state
Section titled “Content from state”When .content() is empty, render falls back to the field state string — useful for computed summaries filled into form state.
Placeholder.make('plan_summary') .label('Plan') .default('Pro · billed annually')

Visible only on edit
Section titled “Visible only on edit”Combine with .visible_on('edit') / .hidden_on('create') so help text appears only for existing records.
Placeholder.make('edit_hint') .content('Changing the slug will break existing links.') .visible_on('edit')

Dehydrated placeholder
Section titled “Dehydrated placeholder”Rarely, you may want placeholder text included in dehydrated state — opt in with .dehydrated(True).
Placeholder.make('snapshot_label') .content('legacy-import') .dehydrated(True)

Closures work on .label(), .helper_text(), .placeholder(), .visible(), .disabled(), and .required() where applicable — see Form closures.