Skip to main content

Conjunto

A Django framework for component-based, plugin-extendable web applications.

Conjunto bundles a curated, opinionated stack so you can build modern, interactive Django apps without wiring the same plumbing together every time:

  • GDAPS — plugin architecture: drop-in apps extend the host through typed interfaces, auto-discovered at startup.
  • Tabler.io (Bootstrap 5) — a complete, themeable admin/app UI kit (light & dark).
  • HTMX — server-rendered interactivity without a SPA build step.
  • django-tables2 + crispy-forms — declarative tables, filters and forms.

The result is a batteries-included foundation for multi-tenant, permission-aware line-of-business applications.

What's in the box

Area What you get
Plugins (GDAPS) Extend menus, settings, tables, login and more via I… interfaces — no host code changes.
Layout app_base.html (topbar, collapsible sidebar, statusbar, offcanvas) and a chrome-less base.html. Server-side theming avoids the dark-mode flash.
Menus IMenuItem registry for topbar, sidebar (2 levels), user dropdown and footer — permission- and visibility-aware.
Scoped settings Layered settings resolution USER > DEVICE > GROUP > TENANT > VENDOR with lockable floors; typed registry, DB-backed, request-cached.
Settings UI Plugin-extendable settings page (ISettingsGroup / ISettingsSection / ISettingsForm) with HTMX save-in-place.
Tenants Multi-tenancy: AbstractTenant, membership & runtime-editable roles, tenant-scoped model managers, and a tenant picker.
Tables & lists TableListView with search, filters, row/header actions and HTMX modals — pluggable via IRowAction / IHeaderAction.
Forms Smart TimeField/TimePickerInput, DatePickerInput, dependent-fields HTMX wiring, persistent file fields, safe-HTML fields.
Toasts & messages Django messages surfaced as Tabler toasts on both full loads and HTMX swaps.
Audit log log_action() + a pluggable action registry.
Dashboard widgets Lazy-loading, reorderable (Gridstack) HTMX widgets with per-user layout.
Auth Plugin-extendable login (ILoginMethod, ILoginViewExtension, IPostLoginAction), remember-me, two-step tenant pick.
Archive Soft-delete + versioning + retention (no django-safedelete needed).
Wizard Multi-step form wizard with session drafts.
Sortable lists Fully HTMX-declarative drag-and-drop ordering for FK-linked models.
Profiles & avatars Optional UserProfile with avatar, plus an always-available {% avatar %} tag.
Optional extras Block CMS (conjunto[cms]) and at-rest encryption (conjunto[crypto]).

Requirements

  • Python ≥ 3.12
  • Django ≥ 6.0

Installation

pip install conjunto            # or: uv add conjunto

Optional subsystems:

pip install "conjunto[cms]"     # block CMS (pulls in django-polymorphic)
pip install "conjunto[crypto]"  # at-rest field/file encryption (pulls in cryptography)

Quick setup

1. Register the app. Add conjunto before django_extensions (it overrides the update_permissions command), and add gdaps for plugin discovery:

INSTALLED_APPS = [
    # ...
    "conjunto",
    "django_extensions",
    "gdaps",
    # optional: "conjunto.profiles", "conjunto.cms", ...
]

2. Add the middleware (order matters — TimezoneMiddleware after ConjuntoMiddleware; ConjuntoMessagesMiddleware after Django's MessageMiddleware and after django_htmx's HtmxMiddleware):

MIDDLEWARE = [
    # ...
    "django.contrib.messages.middleware.MessageMiddleware",
    "django_htmx.middleware.HtmxMiddleware",
    "conjunto.middleware.ConjuntoMiddleware",
    "conjunto.middleware.ConjuntoMessagesMiddleware",
    "conjunto.middleware.TimezoneMiddleware",
]

3. Fetch the front-end libraries. Third-party JS/CSS (Tabler, HTMX, Alpine, TinyMCE, …) are not bundled in the wheel — download them into your project's static tree once:

python manage.py update_libraries --suggest   # prints a CONJUNTO_LIBRARIES = [...] block
# paste it into settings.py, then:
python manage.py update_libraries             # download the files
python manage.py update_libraries --check     # CI guard (no network)

This keeps the wheel small (~1 MB instead of ~16 MB) and puts library versions under your control. See docs/usage/static_libraries.md for CONJUNTO_VENDOR_DIR, STATICFILES_DIRS and CI integration.

The installation guide covers the remaining settings (context processors, .env, layout).

Usage

Full documentation lives under docs/ — start with the layout, menus, scoped settings and tenants guides.

Development

uv sync                          # install deps (dev group included)
uv run pytest                    # run the test suite
uv run pytest tests/test_x.py    # run a single test module
uv run black .                   # format
uv build                         # build the wheel

Formatting is enforced with Black ≥ 25.12.0. Tests run against a bundled test app in tests/.

Contributing

Pull requests and ideas are welcome. For major changes, please open an issue first to discuss the direction.

License

Conjunto is open source under the MIT License. Note that it integrates many third-party libraries, which carry their own (possibly different) licenses — see THIRD_PARTY_LICENSES.md.

Download files

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

Source Distribution

conjunto-0.9.2.tar.gz (5.3 MB view details)

Uploaded Source

Built Distribution

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

conjunto-0.9.2-py3-none-any.whl (705.0 kB view details)

Uploaded Python 3

File details

Details for the file conjunto-0.9.2.tar.gz.

File metadata

  • Download URL: conjunto-0.9.2.tar.gz
  • Upload date:
  • Size: 5.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for conjunto-0.9.2.tar.gz
Algorithm Hash digest
SHA256 9f7a9506955b77f49c54c37d0d9d9d03372ea60a4dab5668aabbcc09ded8cca5
MD5 763a1fe28a690b1d947cf0310e6934ca
BLAKE2b-256 46c638446ff6f08f0922ea28e1a661e3b8b2785fe968dca44618c1f5c16a5f36

See more details on using hashes here.

File details

Details for the file conjunto-0.9.2-py3-none-any.whl.

File metadata

  • Download URL: conjunto-0.9.2-py3-none-any.whl
  • Upload date:
  • Size: 705.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for conjunto-0.9.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f515404ae0fc2296d9fe382e5e5fe87de6f4bd9c22b07e133b4fa2aa41fd0628
MD5 6fe0b1aa8c610bf3abe79a746c099084
BLAKE2b-256 37f5e8c0e4a262d0cce2345f5468704e1e11c19720516634b3d36a662e4b3adf

See more details on using hashes here.

Release history Release notifications | RSS feed

0.11.0

2 files

0.10.1

2 files

0.10.0

2 files

0.9.3

2 files

This release

0.9.2 This release

2 files

0.9.1

2 files

0.9.0

2 files

0.8.0

2 files

0.7.16

2 files

0.7.15

2 files

0.7.14

2 files

0.7.13

2 files

0.7.12

2 files

0.7.11

2 files

0.7.10

2 files

0.7.9

2 files

0.7.8

2 files

0.7.7

2 files

0.7.6

2 files

0.7.5

2 files

0.7.4

2 files

0.7.2

2 files

0.7.1

2 files

0.7.0

2 files

0.6.0

2 files

0.5.7

2 files

0.5.6

2 files

0.5.5

2 files

0.5.4

2 files

0.5.3

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.1.2

2 files

0.1.1

2 files

0.0.25

2 files

0.0.24

2 files

0.0.23

2 files

0.0.22

2 files

0.0.21

2 files

0.0.20

2 files

0.0.19

2 files

0.0.18

2 files

0.0.17

2 files

0.0.16

2 files

0.0.15

2 files

0.0.14

2 files

0.0.13

2 files

0.0.12

2 files

0.0.11

2 files

0.0.10

2 files

0.0.9

2 files

0.0.8

2 files

0.0.7

2 files

0.0.6

2 files

0.0.5

2 files

0.0.4

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 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