Skip to main content

Django + HTMX: A Modern Approach to Building Dynamic Web Applications - Blog Post by TheDarkArtist

Django + HTMX: A Modern Approach to Building Dynamic Web Applications
4 Minutes748 words24 views
@TheDarkArtist
Django + HTMX: A Modern Approach to Building Dynamic Web Applications
article.md748 words

Django + HTMX: A Modern Approach to Building Dynamic Web Applications

Introduction

Django is a powerful web framework that makes building web applications easier. HTMX is a lightweight JavaScript library that allows you to build dynamic, interactive web pages without writing complex JavaScript. Together, Django and HTMX provide a modern approach to building web applications with minimal JavaScript while keeping server-side logic simple.

In this article, we will explore how Django and HTMX work together to build modern, interactive applications. We will cover:

  • What HTMX is and why it matters
  • How to set up Django with HTMX
  • HTMX attributes and how to use them
  • Building a live search feature with Django and HTMX
  • Form handling with HTMX
  • Adding infinite scrolling
  • Handling errors and security concerns

What is HTMX?

HTMX is a JavaScript library that allows you to add AJAX (asynchronous requests), WebSockets, and other interactive features to your web pages using simple HTML attributes. With HTMX, you can:

  • Send HTTP requests directly from HTML elements
  • Swap parts of the page dynamically without reloading
  • Use server-rendered responses instead of writing JavaScript to manipulate the DOM

This makes HTMX a great fit for Django, which is built around server-side rendering.

Setting Up Django with HTMX

First, install Django and create a new project:

pip install django
django-admin startproject myproject
cd myproject
python manage.py startapp myapp

Next, install HTMX in your Django template by including it in your HTML file:

<script src="https://unpkg.com/htmx.org@1.9.5"></script>

Alternatively, you can download HTMX and serve it locally.

Understanding HTMX Attributes

HTMX works by adding special attributes to HTML elements. The most common ones are:

  • hx-get – Makes a GET request to a URL
  • hx-post – Sends a POST request to a URL
  • hx-target – Specifies where to insert the response
  • hx-swap – Defines how the content should be replaced
  • hx-trigger – Specifies when the request should be sent

Example: Fetching Data with HTMX

Let’s create a simple example where clicking a button loads content from the server.

Django View (views.py)

from django.http import HttpResponse
from django.shortcuts import render

def load_message(request):
    return HttpResponse("<p>Hello, this content was loaded dynamically!</p>")

Django URL (urls.py)

from django.urls import path
from .views import load_message

urlpatterns = [
    path('load-message/', load_message, name='load_message'),
]

HTML Template (index.html)

<button hx-get="/load-message/" hx-target="#message">Load Message</button>
<div id="message"></div>

When the button is clicked, HTMX sends a request to /load-message/, and the response is inserted into the <div id="message">.

Building a Live Search Feature

A common use case for HTMX is live search. Let’s implement a live search feature in Django.

Django Model (models.py)

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)

Django View (views.py)

from django.shortcuts import render
from .models import Book

def search_books(request):
    query = request.GET.get('query', '')
    books = Book.objects.filter(title__icontains=query)
    return render(request, 'partials/book_list.html', {'books': books})

Django URL (urls.py)

urlpatterns += [
    path('search-books/', search_books, name='search_books'),
]

HTML Template (search.html)

<input type="text" hx-get="/search-books/" hx-target="#results" hx-trigger="keyup changed delay:300ms">
<div id="results"></div>

Partial Template (partials/book_list.html)

{% for book in books %}
    <p>{{ book.title }}</p>
{% empty %}
    <p>No books found.</p>
{% endfor %}

When typing in the input field, HTMX sends requests to the search-books/ URL and updates the #results div dynamically.

Handling Forms with HTMX

HTMX simplifies form handling by sending data via AJAX without needing JavaScript.

Django View (views.py)

from django.http import JsonResponse
from .models import Book

def add_book(request):
    if request.method == "POST":
        title = request.POST.get("title")
        Book.objects.create(title=title)
        return JsonResponse({"message": "Book added successfully!"})

HTML Template (add_book.html)

<form hx-post="/add-book/" hx-target="#response" hx-swap="innerHTML">
    <input type="text" name="title" placeholder="Book Title">
    <button type="submit">Add Book</button>
</form>
<div id="response"></div>

This submits the form via AJAX and displays a success message.

Adding Infinite Scroll

HTMX can be used to load more content dynamically as a user scrolls.

Django View (views.py)

def load_more_books(request):
    books = Book.objects.all()[:10]  # Fetch next 10 books
    return render(request, 'partials/book_list.html', {'books': books})

HTML Template

<div id="book-list"></div>
<button hx-get="/load-more-books/" hx-target="#book-list" hx-swap="beforeend">Load More</button>

Clicking the button loads more books dynamically.

Handling Errors and Security

To handle errors, you can use the hx-on attribute to catch failure events.

<form hx-post="/add-book/" hx-target="#response" hx-on::after-request="if(event.detail.successful) this.reset()">

For security, always validate form data in Django views and use CSRF tokens.

Conclusion

Django and HTMX make building modern, interactive web applications easy without heavy JavaScript frameworks. By using HTMX’s declarative attributes, you can send AJAX requests, handle forms, implement live search, and add infinite scrolling with minimal JavaScript.

HTMX’s simplicity keeps the frontend lightweight, while Django handles server-side logic efficiently. This combination is perfect for developers who prefer a simple yet powerful way to build dynamic web applications.

comments0 comments

Loading comments...

© 2026 TheDarkArtist (TheDarkArtist)

https://www.thedarkartist.in/blogs/django-htmx-a-modern-approach-to-building-dynamic-web-applications