Form Integration

New

Django form integration helpers that wrap BoundFields with Kaiko UI layout: labels, error messages, and help text.

API Reference

c-form.field

Attribute Description Type Default
field Django BoundField instance (e.g. form.email). Provides label, errors, and help text automatically. BoundField —
label Override the field label. When omitted, reads from field.label. string ""
hint Override the field's help text. When omitted, uses field.help_text. string ""
show_errors When True, renders field validation errors below the widget boolean True
slot Optional widget markup. When provided it replaces {{ field }} rendering — supply a fully-styled DaisyUI widget while keeping the label and error layout. HTML content —

c-form.errors

Attribute Description Type Default
errors Error string list — pass form.non_field_errors(). Renders nothing when the list is empty. list []
color Alert color theme for the error block string "error"

Accessibility

Label association: c-form.field renders a <label> linked to the widget via matching for/id attributes, so screen readers announce the label when the input is focused.

Error messages: validation errors from field.errors are rendered as visible text below the widget. For programmatic association, add aria-describedby to the widget pointing at the error element.

Non-field errors: c-form.errors renders a visually distinct alert block above the form fields so errors are immediately visible without needing to scan individual fields.

Examples

Usage


<form method="post">
  {% csrf_token %}
  <c-form.errors :errors="form.non_field_errors()" />
  <c-form.field :field="form.email" />
  <c-form.field :field="form.password" />
  <c-button type="submit" color="primary">Sign in</c-button>
</form>
          

Text Input via Slot

We'll never share your email.
<c-form.field label="Email address" :required=True hint="We'll never share your email.">
  <input type="email" name="email" class="input w-full" placeholder="you@example.com" />
</c-form.field>

Select via Slot

<c-form.field label="Role">
  <select name="role" class="select w-full">
    <option value="" disabled selected>Choose a role</option>
    <option value="admin">Admin</option>
    <option value="editor">Editor</option>
    <option value="viewer">Viewer</option>
  </select>
</c-form.field>

Field with Validation Errors

Ensure this value has at least 3 characters.

<!-- With a real BoundField — errors render automatically -->
<c-form.field :field="form.username" />

<!-- Simulated inline error in slot -->
<c-form.field label="Username" :required=True>
  <input type="text" name="username" class="input input-error w-full" />
  <p class="label text-error">Ensure this value has at least 3 characters.</p>
</c-form.field>

Textarea via Slot

Maximum 500 characters.
<c-form.field label="Message" hint="Maximum 500 characters.">
  <textarea name="message" class="textarea w-full" rows="4"
    placeholder="Type your message here..."></textarea>
</c-form.field>

Form-Level Errors

<!-- Pass form.non_field_errors() in real forms -->
<c-form.errors :errors="form.non_field_errors()" />

<!-- Color variants -->
<c-form.errors color="error"   :errors="['Invalid credentials.']" />
<c-form.errors color="warning" :errors="['Session expires in 5 minutes.']" />
<c-form.errors color="info"    :errors="['Submitting will log you out.']" />

Full Form Composition

Sign in

Forgot your password? Contact support.
<form method="post">
  {% csrf_token %}

  <c-form.errors :errors="form.non_field_errors()" />

  <c-form.field :field="form.email" />
  <c-form.field :field="form.password" hint="Forgot your password? Contact support." />

  <c-button type="submit" color="primary" class="w-full">Sign in</c-button>
</form>