Skip to main content

dash-form-factory

Generate Dash Bootstrap forms from Pydantic v2 models using a factory pattern.

Installation

pip install dash-form-factory

Or with uv:

uv add dash-form-factory

Quick Start

from typing import Annotated
from pydantic import BaseModel, Field
import dash_bootstrap_components as dbc
from dash import Dash, html, callback, Input, Output
from dash_form_factory import FormFactory, InputField

# 1. Define your Pydantic model
class ContactForm(BaseModel):
    name: Annotated[str, Field(
        "",
        title="Name",
        description="Your full name",
        json_schema_extra={"type": "text"}
    )]
    email: Annotated[str, Field(
        "",
        title="Email",
        description="Your email address",
        json_schema_extra={"type": "email"}
    )]

# 2. Create layout with InputField placeholders
layout = dbc.Card([
    dbc.CardBody([
        InputField("name"),
        InputField("email"),
        dbc.Button("Submit", id="submit")
    ])
])

# 3. Process layout with FormFactory
factory = FormFactory(ContactForm, layout)
form = factory.process_layout(factory.layout)

# 4. Create app and register callbacks
app = Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.layout = html.Div([form, html.Div(id="output")])

@callback(
    output=factory.produce_callback_outputs(),
    inputs=factory.produce_callback_inputs(),
)
def validate(**inputs):
    valid, outputs = factory.validate_callback(inputs)
    return outputs

Pydantic Model Requirements

Each field must include json_schema_extra with a type key:

from typing import Annotated
from pydantic import BaseModel, Field

class MyModel(BaseModel):
    field_name: Annotated[type, Field(
        default_value,
        title="Display Title",
        description="Help text shown below the field",
        json_schema_extra={"type": "field_type"}
    )]

Supported Field Types

Type Component Python Type Description
text dbc.Input str Standard text input
email dbc.Input str Email input with validation styling
integer dbc.Input int Number input with step=1
float dbc.Input float Number input with step="any"
checkbox dbc.Checkbox bool Single checkbox
date-picker dcc.DatePickerRange List[str] Date range selector
dropdown-checklist dbc.DropdownMenu List[Literal[...]] Multi-select dropdown

Date Picker Example

from typing import List

date_range: Annotated[List[str], Field(
    ["2024-01-01", "2024-12-31"],
    title="Date Range",
    json_schema_extra={"type": "date-picker"}
)]

Dropdown Checklist Example

from typing import List, Literal

options: Annotated[List[Literal["opt_a", "opt_b", "opt_c"]], Field(
    [],
    title="Options",
    json_schema_extra={"type": "dropdown-checklist"}
)]

FormFactory API

Constructor

FormFactory(pymodel, layout, active=True)
  • pymodel: Pydantic model class or instance
  • layout: Dash component tree with InputField placeholders
  • active: If False, form fields are disabled

Methods

Method Description
process_layout(layout) Replace InputField placeholders with form components
produce_callback_outputs() Generate Output dict for validation callbacks
produce_callback_inputs(use_state=False) Generate Input/State dict for callbacks
validate_callback(form_data) Validate form data, returns (is_valid, output_dict)

Using with Model Instances

Pass a model instance to pre-fill form values:

instance = ContactForm(name="John", email="john@example.com")
factory = FormFactory(instance, layout)

Disabled Forms

Set active=False for read-only forms:

factory = FormFactory(ContactForm, layout, active=False)

Examples

See the examples/ directory:

  • basic_form.py - Simple contact form
  • advanced_form.py - All field types demo

Run examples with:

uv run python examples/basic_form.py

Comparison with dash-pydantic-form

This package differs has a signifikatn overlap to dash-pydantic-form. Yet differs on some core features:

Feature dash-form-factory dash-pydantic-form
UI Framework Dash Bootstrap Components Dash Mantine Components
Form Rendering Placeholder-based (subset of fields) Auto-renders entire model
Layout Control Full control - embed fields anywhere 4-column responsive grid

Further it is to mention that dash-pydantic-form is much more feautre rich and mature.

Development

# Clone repository
git clone https://github.com/yourusername/dash-form-factory
cd dash-form-factory

# Install with dev dependencies
uv sync --all-groups

# Run tests
uv run pytest

# Run linting
uv run ruff check src/

# Run type checking
uv run mypy src/

License

EUPL

Metadata

Release files for dash-form-factory 0.1.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dash-form-factory 0.1.9
File Size Uploaded
dash_form_factory-0.1.9.tar.gz 8.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dash-form-factory 0.1.9
File Interpreter ABI Platform
dash_form_factory-0.1.9-py3-none-any.whl Python 3 none any Details

Total release size: 18.4 kB

Release files / dash_form_factory-0.1.9.tar.gz

Download URL dash_form_factory-0.1.9.tar.gz
Size 8.4 kB
Tags Source
SHA-256 checksum
How to use checksums
1ab5d909df9e058e8f40d070692a479517c792ec6b06c75c01f3372f13520188
BLAKE2b-256 checksum
How to use checksums
8c5f35fdbf1fcc93c514226722c5254a9118fba9b815d86a9231cb9ec6465962
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / dash_form_factory-0.1.9-py3-none-any.whl

Download URL dash_form_factory-0.1.9-py3-none-any.whl
Size 10.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
76bb4bb5ae8d90095a5689936499b443a19936515d71d9a0863ae068642499ae
BLAKE2b-256 checksum
How to use checksums
9b9ccc16a22538c4b5e2d318f0a37dd365a1a3c23ce31d0045a57edb2ff25d14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.1.9 This release

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page