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 instancelayout: Dash component tree with InputField placeholdersactive: 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 formadvanced_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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f092011377663f9c9dc982c4dcabfa3f5dc38f0d901ebf4934a64902861f765
|
|
| MD5 |
6468ac966ea375db99e4cd984612ac83
|
|
| BLAKE2b-256 |
3771575702ba0d1721fc1098eaad3c496cd5fd9052a201a8754f4de683af007d
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b05bb3f17e6b9b439cdc91fdd78590af15a273ac52eb000843bbcc390c950020
|
|
| MD5 |
190e7fa39a4a873c82968e0882475d10
|
|
| BLAKE2b-256 |
9351ef4fce6e84d420039dc5dfc309b0e12ac352763cf1e95891cf71bbb3a39a
|