Hidden
Introduction
Section titled “Introduction”Hidden renders <input type="hidden" …> only — no wrap_field, label, or helper. Use it for tenant IDs, CSRF companions the host manages, or sticky foreign keys. Unlike most fields, its render() does not short-circuit on is_visible(); keep sensitive values server-side when possible.
Each variation below includes a detailed explanation, the fluent API to paste into your schema, and light/dark screenshots of the rendered control.
Basic hidden
Section titled “Basic hidden”Carry a constant or defaulted value through submit/dehydrate without showing UI.
Hidden.make('tenant_id') .default('tenant_acme')

From record context
Section titled “From record context”Set defaults from closures when filling edit forms so the key always posts with the payload.
Hidden.make('owner_id') .default(lambda record=None, **_: getattr(record, 'owner_id', None))

Custom state path
Section titled “Custom state path”.state_path() remaps where the value lives in nested form state when the field name should differ from the wire path.
Hidden.make('token') .state_path('meta.invite_token') .default('')

With validation
Section titled “With validation”Hidden fields still participate in Form.validate when they have a state path and rules — useful for required foreign keys.
Hidden.make('account_id') .required() .rules('integer')

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