Skip to content

Pydantic Models → UI

kokage-ui can auto-generate forms, tables, and detail views from Pydantic BaseModel definitions. Field types, constraints, and metadata are used to select appropriate HTML input types.

ModelForm

Generates a DaisyUI-styled <form> from a Pydantic model.

from pydantic import BaseModel, Field
from kokage_ui import ModelForm

class User(BaseModel):
    name: str = Field(min_length=1, max_length=100)
    email: str
    age: int = Field(ge=0, le=150, default=30)
    is_active: bool = True

ModelForm(User, action="/users", method="post")

Type → Input Mapping

Python Type HTML Input Notes
str <input type="text"> Default for strings
str (name contains "email") <input type="email"> Heuristic
str (name contains "password") <input type="password"> Heuristic
str (long max_length or name like "bio") <textarea> Heuristic: max_length > 200 or name in bio/description/etc.
int <input type="number" step="1">
float <input type="number" step="any">
bool <input type="checkbox">
Literal["a", "b"] <select> Options from literal values
Enum <select> Options from enum members

Constraint → HTML Attribute Mapping

Pydantic Constraint HTML Attribute
Field(min_length=N) minlength="N"
Field(max_length=N) maxlength="N"
Field(ge=N) min="N"
Field(le=N) max="N"
Field(gt=N) min="N"
Field(lt=N) max="N"
Field(pattern=r"...") pattern="..."

Parameters

Parameter Type Description
model type[BaseModel] Pydantic model class
action str Form action URL
method str HTTP method (default: "post")
submit_text str Submit button text (default: "Submit")
submit_color str DaisyUI color for submit button (default: "primary")
exclude set | list | None Field names to exclude
include set | list | None Only include these fields
instance BaseModel | None Pre-fill with instance values (edit mode)
values dict | None Dict of field values to restore (after validation failure)
errors list[dict] | None Pydantic ValidationError dicts for inline error display

Edit Mode

Pass an instance to pre-fill the form with existing values:

user = User(name="Alice", email="alice@example.com", age=30, is_active=True)

ModelForm(User, action="/users/1/edit", method="post", instance=user)

Validation Errors

Pass errors from a Pydantic ValidationError to show inline error messages:

from pydantic import ValidationError

try:
    user = User.model_validate(form_data)
except ValidationError as e:
    form = ModelForm(
        User,
        action="/users",
        values=form_data,       # Restore entered values
        errors=e.errors(),      # Show error messages
    )

ModelTable

Generates a DaisyUI-styled table from a model definition and a list of instances.

from kokage_ui import ModelTable

users = [
    User(name="Alice", email="alice@example.com", age=30, is_active=True),
    User(name="Bob", email="bob@example.com", age=25, is_active=False),
]

ModelTable(User, rows=users, zebra=True)

Parameters

Parameter Type Description
model type[BaseModel] Pydantic model class
rows list[BaseModel] List of model instances
exclude set | list | None Field names to exclude
include set | list | None Only include these fields
zebra bool Zebra striping
compact bool Compact size
cell_renderers dict[str, Callable] Custom field_name → callable(value) renderers
extra_columns dict[str, Callable] Extra columns: header → callable(row)

Custom Cell Renderers

Override how specific fields are displayed:

from kokage_ui import A, Badge

ModelTable(
    User,
    rows=users,
    cell_renderers={
        "email": lambda v: A(v, href=f"mailto:{v}"),
        "is_active": lambda v: Badge("Active", color="success") if v else Badge("Inactive", color="error"),
    },
)

Extra Columns

Add columns that aren't part of the model:

ModelTable(
    User,
    rows=users,
    extra_columns={
        "Actions": lambda row: A("Edit", href=f"/users/{row.id}/edit", cls="btn btn-sm"),
    },
)

ModelDetail

Generates a card-based detail view from a model instance.

from kokage_ui import ModelDetail

user = User(name="Alice", email="alice@example.com", age=30, is_active=True)
ModelDetail(user, title="User Details")

Each field is displayed as a label-value pair inside a Card component. Boolean values are rendered as colored Badge components.

Parameters

Parameter Type Description
instance BaseModel Pydantic model instance
exclude set | list | None Field names to exclude
include set | list | None Only include these fields
title str | None Card title (defaults to model class name)