Usage

View Mixins

IsHtmxRequestMixin

Use this mixin to ensure that a class-based view only accepts HTMX requests:

from django.views.generic import TemplateView
from django_htmx_tools.views.mixins import IsHtmxRequestMixin

class MyHtmxView(IsHtmxRequestMixin, TemplateView):
    template_name = 'my_template.html'

If a non-HTMX request is made to this view, it will return a 403 Forbidden response.

View Decorators

htmx_only_request

For function-based views, use the htmx_only_request decorator:

from django_htmx_tools.views.decorators import htmx_only_request

@htmx_only_request
def my_htmx_view(request):
    return render(request, 'my_template.html')

Utilities

is_htmx

The is_htmx utility function checks if a request is an HTMX request. This is useful for conditionally rendering different templates or responses based on the request type:

from django.views.generic import ListView
from django_htmx_tools.utils import is_htmx

class TaskListView(ListView):
    model = Task
    template_name = 'task_list.html'

    def get_template_names(self):
        if is_htmx(self.request):
            # Return partial template for HTMX requests
            return ['partials/task_list_partial.html']
        # Return full page template for normal browser requests
        return [self.template_name]

This pattern allows you to serve full HTML pages for initial page loads and partial HTML fragments for HTMX-driven updates, enabling progressive enhancement.

Middleware

htmx_vary_middleware

This middleware adds the proper Vary header for HTMX requests to ensure proper caching behavior. It adds Vary: HX-Request to responses.

Add it to your MIDDLEWARE setting:

MIDDLEWARE = [
    # ... other middleware
    'django_htmx_tools.middleware.htmx.htmx_vary_middleware',
]

htmx_auth_middleware

This middleware handles authentication redirects for HTMX requests. Instead of redirecting to a login page (which would be problematic for HTMX), it returns a 403 Forbidden response with proper HTMX headers.

Add it to your MIDDLEWARE setting:

MIDDLEWARE = [
    # ... other middleware
    'django_htmx_tools.middleware.htmx.htmx_auth_middleware',
]

Example Project

See the example/ directory in the repository for a complete Django project demonstrating all features.

Quick start:

cd example
python manage.py migrate
python manage.py runserver

Visit http://127.0.0.1:8000/ for interactive demos and documentation.