Introduction ============ What is djxi? ------------- djxi is a small utility library that solves the **HTMX scattering problem** in Django projects. Using HTMX with vanilla Django typically means spreading each partial interaction across three separate files: a URL pattern in ``urls.py``, a handler in ``views.py``, and a template snippet somewhere in ``templates/``. As the number of HTMX-powered interactions grows, so does the cognitive overhead of navigating between those files. djxi addresses this by introducing the ``DXEndpointBattery`` — a class that bundles the URL patterns, handler methods, and template sections for a feature into a single, self-contained unit, following the `Locality of Behaviour `_ principle. Key concepts ------------ DXEndpointBattery The central class. Inherit from it, set ``inline_template`` or ``template_name``, decorate methods with routing decorators, then wire the class into your URLConf with ``url_patterns()``. Named sections (````) Templates are split into named blocks using a custom HTML tag. Each block can be rendered independently via ``render_section(request, name, context)``. Sections can embed other sections using ````. Routing decorators ``@dx_get``, ``@dx_post``, ``@dx_put``, ``@dx_patch``, ``@dx_delete``, and the generic ``@dx_action`` mark methods as URL endpoints. ``DXEndpointBattery.url_patterns()`` converts them into Django ``path()`` entries you include in your ``urlpatterns``. battery_prefix Each battery can declare its own URL prefix via the ``battery_prefix`` class attribute, avoiding the need to repeat the prefix in every ``urls.py``. Async handlers Battery methods defined with ``async def`` are served as proper ASGI views. ``arender_section()`` provides an awaitable counterpart to ``render_section()``. Permission hooks ``requires_auth``, ``login_url``, and ``check_permissions()`` gate access to all endpoints on a battery without needing per-view decorators. HTMX header helpers The optional middleware attaches ``request.htmx`` (read HX-* request headers) and ``response.htmx`` (set HX-* response headers) to every request/response pair. All response setters support fluent chaining. Django messages integration Django's built-in messaging framework is wired into every response via HTMX ``hx-swap-oob`` injection so flash messages work without a full page reload. Testing utilities ``djxi.testing`` ships ``DXRequestFactory`` (middleware-aware), standalone assertion helpers, and ``DXBatteryTestCase`` to make battery tests concise and self-contained. djxi_routes command ``python manage.py djxi_routes`` prints a table of every registered battery route — useful for debugging URL configuration. Compatibility ------------- - Python 3.8 – 3.12 - Django 4.2, 5.2, 6.0 - HTMX 2.x and 4.x (selected via ``DX_HTMX_VERSION``) - Fully typed: ships ``py.typed`` for PEP 561 compliance