Skip to main content

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

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dash_form_factory-0.1.8.tar.gz (8.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dash_form_factory-0.1.8-py3-none-any.whl (10.0 kB view details)

Uploaded Python 3

File details

Details for the file dash_form_factory-0.1.8.tar.gz.

File metadata

  • Download URL: dash_form_factory-0.1.8.tar.gz
  • Upload date:
  • Size: 8.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","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}

File hashes

Hashes for dash_form_factory-0.1.8.tar.gz
Algorithm Hash digest
SHA256 4f092011377663f9c9dc982c4dcabfa3f5dc38f0d901ebf4934a64902861f765
MD5 6468ac966ea375db99e4cd984612ac83
BLAKE2b-256 3771575702ba0d1721fc1098eaad3c496cd5fd9052a201a8754f4de683af007d

See more details on using hashes here.

File details

Details for the file dash_form_factory-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: dash_form_factory-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 10.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","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}

File hashes

Hashes for dash_form_factory-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 b05bb3f17e6b9b439cdc91fdd78590af15a273ac52eb000843bbcc390c950020
MD5 190e7fa39a4a873c82968e0882475d10
BLAKE2b-256 9351ef4fce6e84d420039dc5dfc309b0e12ac352763cf1e95891cf71bbb3a39a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page