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
indexpour 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-getvers la routeonline-status,hx-trigger="every 2s",hx-swap="outerHTML". - Serveur:
views.online_statusrenvoie le fragmentindex.html#online-statusavecis_online,status_text,status_color,status_icon.
- Client:
-
Contenu dynamique (
dynamic-content)- Client: un bouton
hx-getversupdate-content, cible#dynamic-content, swapouterHTML. - Serveur:
views.update_contentchoisit une citation/couleur au hasard et renvoieindex.html#dynamic-contentavecquote,color,timestamp.
- Client: un bouton
-
Compteur de likes (
like-counter)- Client: bouton
hx-postverslike-counter, cible#like-counter. - Serveur:
views.like_counterincrémenteLike(id=1)et renvoieindex.html#like-counteraveclike_count.
- Client: bouton
-
Boutique / Panier (
cart-icon+ grille produits)- Client: boutons d’ajout/retrait appellent
add-to-cart/remove-from-cartet 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.5django-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 runserverOuvrez 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 runservertemplate-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