ChatGPT – Cas d’Usage Concrets (Guides pas à pas)
5 workflows reproductibles avec livrables, commandes et tests.
Créer un modèle Django + admin (scaffold complet)
Livrer un CRUD minimal **exploitable** : modèle, admin, vue list, URL, template, tests, commandes.
🎯 Objectif
- App
blogavecArticle(title, slug unique, body, is_published, published_at). - Admin list + search + filters.
- ListView paginée + template minimal.
- Tests pytest (liste non vide + création).
FICHIER: blog/models.py
from django.db import models
from django.utils.text import slugify
class Article(models.Model):
title = models.CharField(max_length=180)
slug = models.SlugField(max_length=200, unique=True)
body = models.TextField()
is_published = models.BooleanField(default=False)
published_at = models.DateTimeField(null=True, blank=True)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)[:200]
super().save(*args, **kwargs)
def __str__(self): return self.titleFICHIER: blog/admin.py
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ("title", "is_published", "published_at")
list_filter = ("is_published",)
search_fields = ("title", "slug")FICHIER: blog/views.py
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
paginate_by = 10
template_name = "blog/article_list.html"FICHIER: blog/urls.py
from django.urls import path
from .views import ArticleListView
urlpatterns = [
path("", ArticleListView.as_view(), name="article_list"),
]FICHIER: templates/blog/article_list.html
<h1>Articles</h1>
<ul>
{% for a in object_list %}
<li>{{ a.title }}{% if a.is_published %} (publié){% endif %}</li>
{% empty %}<li>Aucun article.</li>{% endfor %}
</ul>FICHIER: tests/test_blog.py
import pytest
from blog.models import Article
@pytest.mark.django_db
def test_article_list_view(client):
Article.objects.create(title="Hello", slug="hello", body="x", is_published=True)
resp = client.get("/blog/")
assert resp.status_code == 200
assert b"Articles" in resp.content⚙️ Commandes
python manage.py makemigrations blog
python manage.py migrate
pytest -q🧪 Gate
python -m py_compile $(git ls-files "*.py")
python manage.py check
pytest -qConstruire un template multi-langue (i18n)
Deux approches complémentaires : balises Django i18n ({% trans %}, {% blocktrans %}) + votre pipeline (*.po/.mo*, ou DB, ou Weglot pour le public).
🧱 Balises i18n dans le template
FICHIER: templates/common/navbar.html
<nav>
<a href="/">{% trans "Accueil" %}</a>
<a href="/about/">{% trans "À propos" %}</a>
<a href="/contact/">{% blocktrans %}Contactez-nous{% endblocktrans %}</a>
</nav>🧰 Extraction & compilation
django-admin makemessages -l en -l es
# éditer locale/<lang>/LC_MESSAGES/django.po
django-admin compilemessages🔗 URLs et middleware (rappel)
from django.conf.urls.i18n import i18n_patterns
urlpatterns = [
# sans i18n
]
urlpatterns += i18n_patterns(
path("blog/", include("blog.urls")),
)📎 Notes Ideo-Lab
- Si vous utilisez une **DB de traductions**: mappez chaque chaîne à une clé stable, et rendez-les disponibles via votre contexte (dict
traduction). - Sur la **landing publique**: Weglot peut couvrir le texte dynamique non capté par les *.po*. Vérifier la **détection** des nœuds ajoutés via JS.
🧪 Test rapide
LANGUAGE_CODE="en"; assert "About" in render("common/navbar.html")
LANGUAGE_CODE="fr"; assert "À propos" in render(...)Debug d’un bug Python / JS (méthode & patch minimal)
Un bon debug = **Repro courte** → **Surface** → **Hypothèse** → **Patch minimal** → **Test qui échoue avant / passe après**.
🧪 Gabarit “Evidence Pack”
REPRO : Étapes exactes + payload + URL
TRACE : 20 lignes max
SURFACE : fichiers suspects (chemins + lignes)
ATTENDU : ce qui devrait se passer🐍 Exemple Python (IntegrityError)
# Repro : création de deux users avec le même email => crash.
# Patch minimal (diff)
--- a/accounts/models.py
+++ b/accounts/models.py
@@ -12,6 +12,7 @@
- email = models.EmailField()
+ email = models.EmailField(unique=True)
# Test (échoue avant, passe après)
def test_email_unique(django_user_model):
django_user_model.objects.create(username="u1", email="a@a.com")
with pytest.raises(IntegrityError):
django_user_model.objects.create(username="u2", email="a@a.com")🟨 Exemple JS (scope / this)
// Bug : this non lié dans un handler
btn.addEventListener('click', this.handleClick);
// Patch
btn.addEventListener('click', (e) => this.handleClick(e));🧰 Outils utiles
- Python :
logging,pdb,pytest -k,--maxfail=1 -x. - JS : DevTools (breakpoints),
console.assert, sourcemaps, tests RTL/Vitest.
Optimiser un cron / script (perf & robustesse)
Objectifs : **plus vite**, **moins cher**, **fiable**. Stratégies : profiling, batch/chunk, I/O asynchrone, idempotence, reprises sur erreur.
🧪 Mesurer avant d’optimiser
python -m cProfile -o profile.out manage.py your_command
snakeviz profile.out # ou py-spy, scalene⚙️ Patterns efficaces
- Batching :
bulk_create,bulk_update, chunk de 1k–10k lignes. - DB :
select_related/prefetch_related, index sur filtres/tri. - I/O : requests en session, backoff, parallélisme limité.
- Idempotence : clés uniques /
get_or_create, verrous applicatifs. - Observabilité : logs structurés, métriques (durée, rows/s, erreurs).
# Extrait : traitement par paquets
qs = Model.objects.filter(processed=False).only("id","field").order_by("id")
BATCH=1000
buff=[]
for obj in qs.iterator(chunk_size=BATCH):
obj.processed = True
buff.append(obj)
if len(buff) >= BATCH:
Model.objects.bulk_update(buff, ["processed"])
buff.clear()
if buff:
Model.objects.bulk_update(buff, ["processed"])🧯 Robustesse
try:
# travail
except TransientError:
time.sleep(backoff(i))
retry()🧾 Cron (crontab) — exemple
# à 2h du matin chaque jour
0 2 * * * /path/venv/bin/python /path/app/manage.py your_command --quiet >> /var/log/cron.log 2>&1Préparer un plan de formation (structuré & actionnable)
Un plan utile = objectifs mesurables → modules → exercices → évaluations → livrables.
🎯 Objectifs (exemple Dev Web & IA)
- Savoir générer un scaffold Django/React exploitables avec ChatGPT.
- Maîtriser i18n, tests, CI simple, et patterns RAG.
- Être capable d’auditer/optimiser un cron.
📦 Modules (exemple 2 jours)
J1 AM : Prompting & Contexte (patterns, checklists)
J1 PM : Django CRUD + tests (atelier guidé)
J2 AM : i18n + React component + tests
J2 PM : Cron optimisation + mini-projet évalué🧪 Évaluation
- Quiz rapide (20 questions) + mini-projet à livrer (DoD claire).
- Critères : conformité (PEP8), tests qui passent, respect du plan, documentation courte.
🧱 Modèle JSON (export programme)
{
"title": "Bootcamp Dev Web & ChatGPT",
"duration_hours": 14,
"objectives": ["Scaffold Django/React", "i18n", "Tests & CI", "Cron perf"],
"modules": [
{"title":"Prompting & Contexte","hours":3},
{"title":"Django CRUD + Tests","hours":4},
{"title":"i18n & React","hours":3},
{"title":"Cron & Observabilité","hours":4}
],
"evaluation": {
"quiz": 20,
"project": {"dod":["PEP8","tests OK","doc courte"], "deadline":"J+2 18h"}
}
}📎 Livrables attendus
- Slides PDF + dépôt Git de l’atelier.
- Énoncé & corrigé des exercices.
- Grille d’évaluation & feedback.
