Ce projet démontre comment utiliser les Django Template Partials couplés à HTMX pour des mises à jour ultra-rapides de fragments HTML, sans recharger toute la page. L’interface est stylée avec Tailwind CSS (via CDN) et les interactions dynamiques sont gérées par HTMX (via CDN également).
- Template Partials: mise à jour ciblée de fragments HTML nommés (
{% partialdef %}
…{% endpartialdef %}
). - HTMX: requêtes légères (
hx-get
,hx-post
,hx-trigger
,hx-swap
,hx-swap-oob
). - Composants de démo:
- Badge de statut (online/offline), rafraîchi toutes les 2s.
- Contenu dynamique (citation + couleur + horodatage).
- Compteur de likes persistant en base SQLite via le modèle
Like
. - Boutique / Panier en session, avec mise à jour OOB des quantités produit.
- Fichier:
demo/templates/demo/index-simple.html
. - Cette variante montre le découpage en sous-templates via
{% include %}
(ex.:demo/partials/online-status.html
,demo/partials/dynamic-content.html
,demo/partials/like-counter.html
,demo/partials/cart-icon.html
). - Elle n’est pas reliée au backend par défaut (aucune route ne la sert). Elle sert de référence pédagogique pour visualiser la structure « sans partials ».
- Pour la tester, vous pouvez temporairement modifier la vue
index
pour rendredemo/index-simple.html
, ou ajouter une nouvelle route dédiée.
- Fichier:
demo/templates/demo/index.html
. - Les fragments sont définis inline avec
{% partialdef ... inline %}
(ex.:online-status
,dynamic-content
,like-counter
,cart-icon
). - Côté serveur, les vues renvoient directement un fragment en utilisant la syntaxe
render(request, "demo/index.html#nom-du-fragment", context)
— idéal pour les mises à jour ciblées via HTMX.
-
Badge de statut (
online-status
)- Client:
hx-get
vers la routeonline-status
,hx-trigger="every 2s"
,hx-swap="outerHTML"
. - Serveur:
views.online_status
renvoie le fragmentindex.html#online-status
avecis_online
,status_text
,status_color
,status_icon
.
- Client:
-
Contenu dynamique (
dynamic-content
)- Client: un bouton
hx-get
versupdate-content
, cible#dynamic-content
, swapouterHTML
. - Serveur:
views.update_content
choisit une citation/couleur au hasard et renvoieindex.html#dynamic-content
avecquote
,color
,timestamp
.
- Client: un bouton
-
Compteur de likes (
like-counter
)- Client: bouton
hx-post
verslike-counter
, cible#like-counter
. - Serveur:
views.like_counter
incrémenteLike(id=1)
et renvoieindex.html#like-counter
aveclike_count
.
- Client: bouton
-
Boutique / Panier (
cart-icon
+ grille produits)- Client: boutons d’ajout/retrait appellent
add-to-cart
/remove-from-cart
et ciblent#cart-icon
. - Serveur: panier stocké en session; calcul de
cart_count
; renvoi du fragmentindex.html#cart-icon
. - Démonstration d’Out-Of-Band (OOB) swap via
hx-swap-oob="true"
pour mettre à jour la quantité du produit sans retoucher toute la grille.
- Client: boutons d’ajout/retrait appellent
Défini dans demo/urls.py
:
/
→views.index
(page avec template partials)/like-counter/
→views.like_counter
(POST via HTMX)/update-content/
→views.update_content
/online-status/
→views.online_status
/cart/add/<int:product_id>/
→views.add_to_cart
/cart/remove/<int:product_id>/
→views.remove_from_cart
Déclarées dans pyproject.toml
:
django>=5.2.5
django-template-partials>=25.1
(app Django:template_partials
)
Les bibliothèques côté client sont chargées via CDN:
- HTMX:
https://unpkg.com/[email protected]
- Tailwind CSS:
https://cdn.tailwindcss.com
Prérequis: Python ≥ 3.11, SQLite (inclus), accès réseau pour les CDN.
# Dans le dossier du projet
cd /Users/thibh/template-partials
uv sync
uv run python manage.py migrate
uv run python manage.py runserver
Ouvrez http://127.0.0.1:8000/
.
cd /Users/thibh/template-partials
python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install "django>=5.2.5" "django-template-partials>=25.1"
python manage.py migrate
python manage.py runserver
template-partials/
├── demo/
│ ├── templates/demo/
│ │ ├── index.html # Variante avec template partials (utilisée)
│ │ ├── index-simple.html # Variante pédagogique sans partials (non routée)
│ │ └── partials/
│ │ ├── online-status.html
│ │ ├── dynamic-content.html
│ │ ├── like-counter.html
│ │ └── cart-icon.html
│ ├── views.py
│ ├── urls.py
│ └── models.py # Modèle Like(count)
├── testpartials/
│ └── settings.py # App installée: template_partials, demo
├── manage.py
├── pyproject.toml
└── README.md
- La base de données SQLite (
db.sqlite3
) est utilisée pour le compteur de likes. Les migrations sont fournies. - Pour tester
index-simple.html
, reliez-la à une vue/URL ou modifiez temporairement le rendu dansviews.index
. - Les CDN (HTMX, Tailwind) évitent toute configuration node/npm.
- Django Template Partials: https://github.com/carltongibson/django-template-partials
- HTMX: https://htmx.org
- Tailwind CSS: https://tailwindcss.com