Skip to main content

djhtmx

CI

Interactive UI Components for Django using htmx

Agent Skills

This repository is the home of three skills for coding agents: djhtmx-setup for wiring djhtmx into a project and its settings, djhtmx-components for writing components, and djhtmx-testing for testing them. Install them in your project with dotagents, so the guidance travels with the library instead of drifting in each consumer:

[[skills]]
name = "djhtmx-setup"
source = "edelvalle/djhtmx"

[[skills]]
name = "djhtmx-components"
source = "edelvalle/djhtmx"

[[skills]]
name = "djhtmx-testing"
source = "edelvalle/djhtmx"

They describe djhtmx alone; the conventions of your own project belong in a skill of your own that points at these.

Install

uv add djhtmx

or

pip install djhtmx

Configuration

djhtmx needs Redis running for component state, and five things wired:

INSTALLED_APPS = [
    ...,
    "djhtmx",
]

# Last, so its exception hook runs first.
MIDDLEWARE = [
    ...,
    "djhtmx.middleware",
]

TEMPLATES = [{
    ...,
    "OPTIONS": {"context_processors": [
        ...,
        "django.template.context_processors.request",
        "djhtmx.context.component_repo",
    ]},
}]
# urls.py -- the prefix is yours
urlpatterns = [
    ...,
    path("_htmx/", include("djhtmx.urls")),
]
{# the base template #}
{% load htmx %}
<!doctype html>
<html>
  <head>
    {% htmx-headers %}
  </head>
</html>

DJHTMX_REDIS_URL defaults to redis://localhost/0. Every setting, what running server-sent events asks of the deployment, and what to look at when a component renders but does not respond are in the djhtmx-setup skill.

Getting started

djhtmx is a framework for building components, not a component library: it ships no components, templates or styles, and is unopinionated about all three.

Components are discovered in the htmx module -- or the htmx package -- of each installed app.

from djhtmx.component import HtmxComponent


class Counter(HtmxComponent):
    _template_name = "Counter.html"
    counter: int = 0

    def inc(self, amount: int = 1):
        self.counter += amount

The inc event handler is ready to be called from the front-end to respond to an event.

The counter.html would be:

{% load htmx %}
<div {% hx-tag %}>
  {{ counter }}
  <button {% on "inc" %}>+</button>
  <button {% on "inc" amount=2 %}>+2</button>
</div>

When the event is dispatched to the back-end the component state is reconstructed, the event handler called and then the full component is rendered back to the front-end.

Now use the component in any of your html templates, by passing attributes that are part of the component state:

{% load htmx %}

Counters: <br />
{% htmx "Counter" %} Counter with init value 3:<br />
{% htmx "Counter" counter=3 %}

The djhtmx-components skill covers the rest -- state and model fields, handlers, events, model subscriptions, query-string state, rendering, SSE -- and djhtmx-testing covers testing components with djhtmx.testing.Htmx.

Metadata

Release files for djhtmx 1.4.0

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

Source distribution (sdist)

Source distribution for djhtmx 1.4.0
File Size Uploaded
djhtmx-1.4.0.tar.gz 247.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for djhtmx 1.4.0
File Interpreter ABI Platform
djhtmx-1.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 504.5 kB

Release files / djhtmx-1.4.0.tar.gz

Download URL djhtmx-1.4.0.tar.gz
Size 247.5 kB
Tags Source
SHA-256 checksum
How to use checksums
56efab3ddbaccae389e8ed63eeb6be0c8219c2c21cbcfd9a050049122cd6f6c4
BLAKE2b-256 checksum
How to use checksums
146cb6a1c8c06f412078431c193403558e4bf48c0b899e0d2790acbd726f2970
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Omarchy","version":"4.0.4","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / djhtmx-1.4.0-py3-none-any.whl

Download URL djhtmx-1.4.0-py3-none-any.whl
Size 256.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0a5d4f599a3ab9e72e8708fb5cba9cef68833a40294ae5f9ac8fb6873d1a2ac9
BLAKE2b-256 checksum
How to use checksums
a73c98f83679a3a8970c7679cdc3fb57e573cdcd834f1294dfeb2a6d34f80151
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Omarchy","version":"4.0.4","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

1.5.0

2 release files

This release

1.4.0 This release

2 release files

1.3.13

2 release files

1.3.12

2 release files

1.3.11

2 release files

1.3.9

2 release files

1.3.8

2 release files

1.3.7

2 release files

1.3.6

2 release files

1.3.5

2 release files

1.3.4

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.9

2 release files

1.2.8

2 release files

1.2.7

2 release files

1.2.6

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

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