Le monde du frontend est saturé de frameworks JavaScript. Chaque année, un nouveau framework promet de tout révolutionner. htmx propose une alternative radicale : envoyer du HTML depuis le serveur, pas du JSON. Et ça fonctionne mieux qu'on ne le pense.
Le problème que htmx résout
Avec Django + DRF + React, vous maintenez deux applications distinctes : le backend Django qui sérialise en JSON, et le frontend React qui désérialise et rend. Deux codebases, deux déploiements, deux cycles de build.
Pour les applications CRUD classiques — et c'est la grande majorité des applications métier — cette complexité est rarement justifiée.
Comment htmx fonctionne en 5 minutes
htmx ajoute des attributs HTML qui permettent de faire des requêtes HTTP et de remplacer des parties du DOM avec la réponse :
<!-- Un bouton "J'aime" qui met à jour le compteur sans rechargement -->
<button hx-post="/articles/42/like/"
hx-target="#like-count"
hx-swap="innerHTML"
hx-indicator="#spinner">
J'aime
</button>
<span id="like-count">127</span>
La vue Django retourne simplement un fragment HTML :
@require_POST
def like_article(request, pk):
article = get_object_or_404(Article, pk=pk)
article.likes += 1
article.save(update_fields=["likes"])
return HttpResponse(str(article.likes))
C'est tout. Pas de serializer, pas de store Redux, pas de useEffect.
Exemple concret : filtrage de liste sans rechargement
<input type="text" name="q"
hx-get="/articles/liste/"
hx-target="#liste-articles"
hx-trigger="keyup changed delay:300ms"
placeholder="Rechercher...">
<div id="liste-articles">
{% include "partials/articles_liste.html" %}
</div>
def liste_articles(request):
q = request.GET.get("q", "")
articles = Article.objects.filter(
titre__icontains=q, statut="publie"
).select_related("theme")[:20]
if request.htmx:
return render(request, "partials/articles_liste.html", {"articles": articles})
return render(request, "blog/liste.html", {"articles": articles})
Résultat : une recherche temps réel en ~15 lignes de code, zéro JavaScript écrit.
Ce que htmx gère nativement
- Requêtes AJAX (GET, POST, PUT, DELETE, PATCH)
- Remplacement partiel du DOM avec ciblage CSS selector
- Indicateurs de chargement (
hx-indicator) - Infinite scroll et pagination (
hx-trigger="revealed") - Validation de formulaires en temps réel
- WebSockets et Server-Sent Events
Quand choisir htmx vs React
htmx : applications CRUD, dashboards admin, sites de contenu, formulaires complexes, équipes Django sans expertise React.
React/Vue : éditeurs de documents complexes, jeux, visualisations temps réel avec beaucoup d'état côté client, ou si l'API doit être consommée par mobile également.
L'écosystème Django + htmx
- django-htmx : middleware qui expose
request.htmxet des utilitaires - django-template-partials : réutilisation de fragments de templates
- Alpine.js : pour le petit JS local sans serveur (dropdown, collapse, toggle)
Mon verdict
Pour votre prochain projet interne ou client, essayez htmx avant de partir sur React. Vous serez surpris par ce que vous pouvez construire sans écrire une ligne de JavaScript. Et votre prochain développeur Django qui reprend le code vous remerciera.