Produit avec back-office et admin Django
Repères utiles :
- Django DRF LLM Wiki
- SCHEMA
- Comprendre Django
- Comprendre Django REST Framework
- Comment penser une API avec Django DRF
- Les briques de base de Django DRF
- Backend pour application web ou mobile avec Django DRF
- API avec utilisateurs, rôles et permissions avec Django DRF
- Application métier / SaaS / outil interne avec Django DRF
- Parcours de lecture
- FAQ, erreurs fréquentes et conseils pratiques
Ce tutoriel explique pourquoi Django est particulièrement intéressant lorsqu'un produit a besoin d'un back-office, d'une interface d'administration ou d'outils d'exploitation internes. L'objectif est de comprendre la différence entre produit utilisateur, back-office et admin Django, de savoir quand l'admin intégré suffit, quand il faut aller plus loin, et comment construire un backend qui sert aussi les équipes internes.
1. Introduction
Quand on parle d'un produit numérique, on pense souvent d'abord à l'interface visible par l'utilisateur final.
Mais dans énormément de projets réels, cette interface publique ou client n'est qu'une partie du système. En coulisses, il faut aussi souvent :
- corriger des données
- vérifier des comptes
- modérer du contenu
- relancer un workflow
- suivre des incidents
- valider certaines étapes
- aider le support
- superviser l'activité
Autrement dit, le produit a souvent besoin d'un back-office. Et c'est précisément l'un des domaines où Django possède un avantage historique très fort grâce à son admin intégré.
2. Le problème concret à résoudre
Imaginons un produit qui fonctionne déjà côté utilisateur. Les clients peuvent :
- créer des comptes
- utiliser des fonctionnalités
- générer des objets métier
- soumettre des demandes
- consulter leurs résultats
Tout semble bien aller. Mais très vite, l'équipe interne se retrouve face à des besoins très concrets :
- un utilisateur a un problème et il faut inspecter son dossier
- une donnée est incohérente et doit être corrigée
- un workflow est bloqué et il faut comprendre pourquoi
- un rôle doit être changé manuellement
- un document doit être revu ou supprimé
- un compte doit être suspendu
- une activité suspecte doit être analysée
Le vrai problème n'est donc pas seulement de construire une application pour les utilisateurs. Le vrai problème est de construire aussi un système opérable par l'équipe qui porte le produit.
3. Pourquoi ce use case est si important
Beaucoup de projets découvrent ce sujet trop tard.
Au début, toute l'énergie va sur :
- le frontend client
- l'API principale
- les fonctionnalités visibles
Puis un jour l'équipe se rend compte qu'elle n'a pas de bons outils pour :
- superviser
- corriger
- auditer
- assister
- administrer
Et là, le coût monte vite.
Un bon produit n'est pas seulement utilisable par ses clients. Il doit aussi être pilotable par ses équipes internes.
4. Qu'est-ce qu'un back-office ?
Un back-office est une interface ou un ensemble d'outils utilisés par les équipes internes pour gérer, surveiller, corriger ou administrer le produit.
Exemples d'usages de back-office :
- consulter un dossier utilisateur
- changer un statut
- modérer un contenu
- réinitialiser un paramètre
- vérifier des événements métier
- exporter des données
- corriger une anomalie
- superviser un workflow
Un back-office n'est donc pas simplement “une deuxième interface”. C'est un outil de travail pour les équipes internes.
5. Qu'est-ce que l'admin Django ?
L'admin Django est une interface d'administration générée à partir de tes modèles Django.
Elle permet souvent très vite de :
- lister des objets
- les rechercher
- les filtrer
- les consulter
- les modifier
- les supprimer
- gérer certains liens entre objets
C'est un des grands atouts de Django. Et c'est aussi l'une des raisons pour lesquelles il est très apprécié dans les produits métiers, les SaaS et les outils internes.
6. Ce qu'il faut comprendre tout de suite
Il y a trois choses différentes qu'il faut bien distinguer.
6.1 Le produit utilisateur
C'est ce que voit le client ou l'utilisateur final.
6.2 Le back-office
C'est l'interface ou la logique interne utilisée par les équipes du produit.
6.3 L'admin Django
C'est un outil interne extrêmement puissant, mais ce n'est pas automatiquement un back-office final parfait pour tous les cas.
Cette distinction est très importante.
L'admin Django peut être une solution parfaite dans certains contextes, une excellente solution transitoire dans d'autres, et une base insuffisante dans d'autres encore. Tout dépend du besoin réel.
7. Pourquoi Django est particulièrement pertinent ici
Django est très fort pour ce use case pour plusieurs raisons.
7.1 L'admin est native
Contrairement à beaucoup d'autres stacks, Django te donne très tôt une interface interne exploitable.
7.2 L'admin repose sur les modèles
Si tes modèles sont bien pensés, tu peux rapidement administrer une grande partie du système.
7.3 Django aime les produits structurés
Dès qu'il y a :
- des objets métier
- des relations
- des statuts
- des rôles
- des permissions
- des besoins d'exploitation
Django devient très naturel.
7.4 Le couple Django + DRF permet deux mondes complémentaires
- DRF expose une API propre pour les clients du produit
- Django admin ou un back-office dédié aide les équipes internes à piloter le système
Cette combinaison est très puissante.
8. Quand utiliser Django DRF pour ce cas
C'est un excellent choix si ton produit a besoin :
- d'une API pour le frontend utilisateur
- d'une base de données structurée
- d'un outil interne pour supervision ou support
- d'une interface d'administration rapide
- d'une logique métier durable
- d'opérations internes fréquentes
- de rôles et permissions bien définis
Exemples typiques :
- produit SaaS avec support client
- outil métier avec étapes de validation
- plateforme avec modération
- app où certains objets doivent être revus ou corrigés en interne
- système où une équipe admin ou ops intervient régulièrement
9. Quand ce n'est pas forcément le bon angle
Ce use case est moins central si :
- tu construis un produit très petit, très simple, et sans véritable exploitation interne
- tu n'as presque jamais besoin d'agir côté équipe interne
- tu veux un prototype très jetable
- tu n'as pas de données sensibles ni de besoin d'administration réelle
Mais encore une fois, beaucoup de produits pensent être “simples” jusqu'au jour où le support, la correction manuelle ou la supervision deviennent incontournables.
10. Pré-requis
Pour tirer profit de ce tutoriel, il est conseillé d'avoir déjà lu :
- Comprendre Django
- Comprendre Django REST Framework
- Comment penser une API avec Django DRF
- Les briques de base de Django DRF
- Application métier / SaaS / outil interne avec Django DRF
Les notes suivantes sont aussi très liées :
- Backend pour application web ou mobile avec Django DRF
- API avec utilisateurs, rôles et permissions avec Django DRF
11. Vocabulaire indispensable
Back-office
Interface ou outillage utilisé par les équipes internes pour piloter le produit.
Admin Django
Interface d'administration générée par Django autour des modèles.
Modération
Action qui consiste à contrôler, valider, cacher ou supprimer certains contenus ou objets.
Exploitation
Ensemble des besoins liés au fonctionnement quotidien du produit : supervision, correction, assistance, opérations internes.
Audit
Capacité à vérifier qui a fait quoi, sur quoi et quand.
Support
Travail d'assistance aux utilisateurs ou aux équipes.
Outil interne
Outil réservé à l'équipe ou à l'organisation qui exploite le produit.
12. Vision d'ensemble
Dans ce use case, il faut arrêter de penser le backend seulement comme une couche API pour le frontend client.
Le backend devient aussi :
- la source de vérité des données
- le gardien des règles métier
- le support de l'exploitation interne
- la base de l'administration du produit
On peut résumer le tout comme ceci :
- le produit utilisateur sert les clients
- l'API Django DRF structure les interactions applicatives
- la logique métier protège les règles du système
- le back-office et/ou l'admin Django servent les équipes internes
- la base de données garde l'état et l'historique
13. Architecture type
Voici une architecture simple pour raisonner correctement.
graph TD
A[Frontend utilisateur] --> B[API Django DRF]
H[Back-office interne] --> B
I[Admin Django] --> E[Base de données]
B --> C[Logique métier]
B --> D[Authentification et permissions]
C --> E[Base de données]
C --> F[Audit / historique / opérations]
C --> G[Services externes optionnels]
13.1 Frontend utilisateur
Il sert l'expérience du client ou de l'utilisateur final.
13.2 API Django DRF
Elle structure les opérations applicatives normales.
13.3 Back-office interne
Il sert les besoins métiers internes, le support, la supervision ou la validation.
13.4 Admin Django
Il peut servir de :
- point d'administration rapide
- outil support
- outil ops
- base de travail avant un back-office plus sur mesure
13.5 Audit et historique
Ils deviennent souvent très importants dans ce type de produit.
14. Quand l'admin Django suffit vraiment
Il faut être honnête : dans beaucoup de projets, l'admin Django est déjà extrêmement utile.
Il peut suffire si tu as surtout besoin de :
- consulter les objets
- corriger certaines données
- filtrer et rechercher
- modifier quelques statuts
- gérer des comptes ou des objets métier simples
- aider une petite équipe interne
Dans ce cas, chercher tout de suite à construire un back-office custom peut être inutilement coûteux.
15. Quand l'admin Django ne suffit plus vraiment
L'admin Django atteint ses limites quand les besoins internes deviennent plus sophistiqués.
Exemples :
- parcours internes très spécifiques
- ergonomie métier complexe
- tableaux de bord opérationnels avancés
- workflows de validation riches
- interfaces conçues pour des équipes non techniques nombreuses
- actions internes très guidées et contextuelles
Dans ce cas, il faut souvent compléter ou remplacer certaines parties par un back-office plus spécifique.
16. La vraie bonne question à se poser
La bonne question n'est pas :
“Est-ce que je dois utiliser l'admin Django ?”
La bonne question est plutôt :
“De quels outils internes mes équipes ont-elles réellement besoin pour opérer le produit correctement ?”
Ensuite seulement, on décide si :
- l'admin Django suffit
- l'admin Django suffit au début
- il faut un back-office dédié
- il faut un mélange des deux
17. Construction pas à pas
Voici une manière saine de construire ce type de produit.
Étape 1 — Identifier les besoins d'exploitation
Ne pense pas seulement au client final. Liste les besoins de l'équipe interne.
Exemples :
- rechercher un utilisateur
- voir ses objets liés
- corriger un statut
- relancer un processus
- vérifier un historique
- modérer un contenu
- suspendre un compte
Étape 2 — Distinguer les besoins support, ops, admin et métier
Tous les besoins internes ne sont pas identiques.
Exemples :
- support : aider un utilisateur
- ops : surveiller le bon fonctionnement
- admin : configurer ou corriger
- métier : valider ou superviser un processus
Cette distinction aide à ne pas tout mélanger dans une seule interface confuse.
Étape 3 — Identifier quelles ressources doivent être administrables
Tout n'a pas forcément besoin d'être administré de la même façon.
Exemples :
- utilisateurs
- dossiers
- commandes
- contenus
- pièces jointes
- événements
- historiques
Étape 4 — Identifier quelles actions internes sont sensibles
Par exemple :
- changement de rôle
- suppression
- validation forcée
- modification de statut
- accès à certaines données confidentielles
Ces actions demandent souvent une attention particulière côté permissions et audit.
Étape 5 — Décider ce qui passe par l'admin Django
Pose-toi :
- cette action est-elle surtout technique ou opérationnelle ?
- son ergonomie peut-elle rester simple ?
- un outil générique suffit-il ?
Si oui, l'admin Django peut être parfait.
Étape 6 — Décider ce qui mérite un vrai back-office métier
Si l'équipe interne a besoin de :
- parcours dédiés
- vues synthétiques spécifiques
- actions guidées
- dashboards ciblés
- écrans adaptés à un processus métier précis
alors un back-office plus dédié est souvent préférable.
Étape 7 — Prévoir l'audit et l'historique
Dans ce type de produit, une question arrive souvent tôt ou tard :
- qui a fait ce changement ?
- quand ?
- dans quel contexte ?
Ne pas prévoir cela assez tôt peut vite rendre le produit difficile à exploiter.
Étape 8 — Prévoir des permissions internes sérieuses
Le fait qu'une interface soit “interne” ne veut pas dire que tout le monde doit pouvoir tout faire.
Il faut se demander :
- qui peut lire ?
- qui peut modifier ?
- qui peut supprimer ?
- qui peut voir des données sensibles ?
- qui peut effectuer une action d'administration ?
Étape 9 — Penser la qualité de vie des équipes internes
Une interface interne mal pensée coûte du temps, crée des erreurs et fatigue les équipes.
Il faut donc penser aussi :
- recherche
- filtres
- lisibilité
- sécurité des actions
- confirmations
- historique
- repérage rapide des anomalies
Étape 10 — Ne pas surconstruire trop tôt
Il faut rester pragmatique.
Souvent, une bonne stratégie est :
- démarrer avec l'admin Django
- observer les vrais besoins internes
- créer ensuite un back-office plus ciblé là où c'est nécessaire
18. Exemple concret mental
Imaginons une plateforme de gestion documentaire.
Côté utilisateur
Les clients peuvent :
- déposer des documents
- voir leur statut
- recevoir un résultat ou une validation
Côté interne
L'équipe a besoin de :
- voir les documents en attente
- corriger des métadonnées
- reclasser certains objets
- valider ou rejeter certains cas
- aider les utilisateurs en difficulté
- auditer des changements sensibles
Dans ce cas :
- l'API Django DRF sert le produit utilisateur
- l'admin Django peut déjà aider à gérer une partie des opérations
- un back-office dédié peut devenir utile pour les validations ou la supervision fine
19. Ce que le frontend utilisateur ne doit pas porter
Une erreur classique consiste à vouloir faire passer tous les besoins internes dans le frontend principal.
Ce n'est généralement pas une bonne idée.
Le frontend utilisateur doit servir l'utilisateur final. Il ne doit pas devenir un cockpit brouillon pour le support, l'admin, la modération et les opérations internes.
C'est précisément pour cela que la séparation :
- produit utilisateur
- back-office
- admin
est si importante.
20. Erreurs fréquentes
Erreur 1 — Oublier l'exploitation jusqu'à la fin
On découvre trop tard que l'équipe interne n'a pas d'outils corrects.
Erreur 2 — Croire que l'admin Django remplace automatiquement tout back-office
Parfois oui, souvent partiellement, parfois non. Il faut juger selon le besoin réel.
Erreur 3 — Construire un back-office custom trop tôt
L'inverse existe aussi. On peut surinvestir dans une interface interne sur mesure avant d'avoir compris les vrais usages.
Erreur 4 — Oublier les permissions internes
Une interface interne non contrôlée peut devenir très risquée.
Erreur 5 — Négliger l'audit
Sans historique ni visibilité sur les actions sensibles, l'exploitation devient fragile.
Erreur 6 — Mélanger produit utilisateur et opérations internes
Cela dégrade souvent les deux mondes à la fois.
21. Bonnes pratiques
21.1 Identifier tôt les besoins internes
Le produit n'est pas seulement fait pour le client ; il est aussi vécu par les équipes qui le maintiennent.
21.2 Utiliser l'admin Django intelligemment
L'admin n'est pas un gadget. C'est souvent un accélérateur très puissant.
21.3 Faire simple au début, puis spécialiser
Commencer pragmatique, puis construire un back-office plus sur mesure là où le besoin est prouvé.
21.4 Protéger les actions sensibles
Tout ce qui modifie fortement le système doit être bien encadré.
21.5 Prévoir l'audit et la supervision
Surtout si le produit a un impact métier fort.
21.6 Séparer les rôles des interfaces
Tous les outils internes ne doivent pas être accessibles à tous les rôles.
22. Variantes et évolutions possibles
Variante 1 — Produit simple avec admin Django uniquement
Très valable pour certaines équipes petites ou moyennes.
Variante 2 — Produit avec admin + quelques écrans internes dédiés
Approche souvent très saine.
Variante 3 — Produit avec vrai back-office métier
Nécessaire quand les besoins internes sont riches et fréquents.
Variante 4 — Produit avec forte exigence d'audit
Nécessite plus d'historique, de traçabilité et de contrôle.
Variante 5 — Produit plus mature avec plusieurs équipes internes
Support, ops, conformité, métier, admin : chacun peut avoir ses besoins propres.
23. Comment savoir si tu es sur la bonne voie
Tu avances bien si :
- tu sais distinguer produit utilisateur, admin et back-office
- tu sais quelles actions internes sont réellement nécessaires
- tu n'imposes pas trop tôt une interface sur mesure inutile
- tu n'oublies pas l'audit, la sécurité et l'exploitation
- ton équipe interne peut travailler sans bricoler la base de données à la main
24. Résumé final
Django est particulièrement fort quand un produit a besoin non seulement d'une API ou d'une interface utilisateur, mais aussi d'une vraie capacité d'administration et d'exploitation interne.
Son avantage distinctif ici vient du fait qu'il permet de combiner :
- un backend structuré
- une logique métier durable
- une API propre avec DRF
- un admin intégré immédiatement utile
- la possibilité de faire évoluer ensuite un vrai back-office métier
L'idée la plus importante à retenir est la suivante :
un bon produit n'est pas seulement bien conçu pour ses utilisateurs finaux ; il doit aussi être bien outillé pour les équipes qui le pilotent et le maintiennent.
25. Pour aller plus loin
La suite logique du wiki peut maintenant être :
- Application centrée base de données avec Django DRF
- ou API B2B / API interne avec Django DRF
- ou une future comparaison dédiée :
admin Django vs back-office sur mesure
Relire aussi :
- Application métier / SaaS / outil interne avec Django DRF
- API avec utilisateurs, rôles et permissions avec Django DRF
- Backend pour application web ou mobile avec Django DRF
26. Mini-projet guidé avec code
Pour rendre ce use case concret, on va prendre un exemple très représentatif :
un produit avec des commandes clients, un espace interne de suivi, et un back-office réservé aux équipes opérationnelles
Le but du mini-projet est de montrer :
- comment Django peut fournir un admin immédiat
- comment DRF peut exposer une API back-office dédiée
- comment les équipes internes peuvent exécuter des actions métier sans dépendre du frontend utilisateur
27. Structure du mini-projet
opsdesk/
├── manage.py
├── opsdesk/
│ ├── settings.py
│ ├── urls.py
│ └── ...
└── orders/
├── admin.py
├── models.py
├── serializers.py
├── permissions.py
├── views.py
└── urls.py
Repères utiles avant de lire le code :
models.pystructure la commande client et l'historique d'événements internes.serializers.pyrenvoie la commande avec le contexte opérationnel utile au back-office.permissions.pylimite l'API interne aux comptes staff.views.pyexpose des actions métier concrètes commemark_paidetship.urls.pysépare explicitement l'API back-office du reste du produit.admin.pyfournit immédiatement une interface interne exploitable pour l'équipe.
28. Implémentation guidée avec code
Étape 1 — Créer le projet et installer DRF
python -m venv .venv
source .venv/bin/activate
pip install django djangorestframework
django-admin startproject opsdesk .
python manage.py startapp orders
Étape 2 — Déclarer DRF et l'application dans settings.py
Dans opsdesk/settings.py :
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"rest_framework",
"orders",
]
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated",
],
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.SessionAuthentication",
"rest_framework.authentication.BasicAuthentication",
],
}
Étape 3 — Modéliser les commandes et les événements internes
Dans orders/models.py :
from django.conf import settings
from django.db import models
class CustomerOrder(models.Model):
STATUS_CHOICES = [
("new", "New"),
("paid", "Paid"),
("shipped", "Shipped"),
("cancelled", "Cancelled"),
]
customer = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="customer_orders",
)
reference = models.CharField(max_length=40, unique=True)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default="new")
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
shipping_address = models.TextField()
internal_note = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self) -> str:
return self.reference
class OrderEvent(models.Model):
order = models.ForeignKey(
CustomerOrder,
on_delete=models.CASCADE,
related_name="events",
)
event_type = models.CharField(max_length=50)
comment = models.TextField(blank=True)
created_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="order_events",
)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self) -> str:
return f"{self.order.reference} - {self.event_type}"
Puis lancer :
python manage.py makemigrations
python manage.py migrate
Pourquoi ? Parce qu'un back-office sérieux ne manipule pas seulement un état courant : il a aussi besoin d'un historique d'actions internes.
Étape 4 — Créer les serializers
Dans orders/serializers.py :
from rest_framework import serializers
from .models import CustomerOrder, OrderEvent
class OrderEventSerializer(serializers.ModelSerializer):
created_by = serializers.StringRelatedField(read_only=True)
class Meta:
model = OrderEvent
fields = ["id", "event_type", "comment", "created_by", "created_at"]
read_only_fields = ["id", "created_by", "created_at"]
class CustomerOrderSerializer(serializers.ModelSerializer):
customer = serializers.StringRelatedField(read_only=True)
events = OrderEventSerializer(many=True, read_only=True)
class Meta:
model = CustomerOrder
fields = [
"id",
"reference",
"customer",
"status",
"total_amount",
"shipping_address",
"internal_note",
"created_at",
"events",
]
read_only_fields = ["id", "customer", "status", "created_at", "events"]
Pourquoi ? Parce que l'API back-office ne doit pas juste renvoyer une commande brute : elle doit aussi donner du contexte opérationnel.
Étape 5 — Poser une permission staff-only
Dans orders/permissions.py :
from rest_framework.permissions import BasePermission
class IsBackOfficeStaff(BasePermission):
def has_permission(self, request, view):
return bool(request.user and request.user.is_authenticated and request.user.is_staff)
def has_object_permission(self, request, view, obj):
return bool(request.user and request.user.is_staff)
Pourquoi ? Parce que cette API n'est pas destinée aux clients finaux. Elle est destinée aux équipes internes.
Étape 6 — Écrire le viewset back-office
Dans orders/views.py :
from rest_framework import status, viewsets
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from .models import CustomerOrder, OrderEvent
from .permissions import IsBackOfficeStaff
from .serializers import CustomerOrderSerializer
class BackOfficeOrderViewSet(viewsets.ModelViewSet):
serializer_class = CustomerOrderSerializer
permission_classes = [IsAuthenticated, IsBackOfficeStaff]
def get_queryset(self):
return CustomerOrder.objects.select_related("customer").prefetch_related("events").order_by("-created_at")
@action(detail=True, methods=["post"])
def mark_paid(self, request, pk=None):
order = self.get_object()
if order.status != "new":
return Response(
{"detail": "Seule une commande nouvelle peut être marquée comme payée."},
status=status.HTTP_400_BAD_REQUEST,
)
order.status = "paid"
order.save(update_fields=["status"])
OrderEvent.objects.create(
order=order,
event_type="marked_paid",
comment="Paiement validé par le back-office.",
created_by=request.user,
)
return Response(self.get_serializer(order).data)
@action(detail=True, methods=["post"])
def ship(self, request, pk=None):
order = self.get_object()
if order.status != "paid":
return Response(
{"detail": "Seule une commande payée peut être expédiée."},
status=status.HTTP_400_BAD_REQUEST,
)
order.status = "shipped"
order.save(update_fields=["status"])
OrderEvent.objects.create(
order=order,
event_type="shipped",
comment="Commande expédiée.",
created_by=request.user,
)
return Response(self.get_serializer(order).data)
Pourquoi ce code est intéressant ? Parce qu'il montre très bien la différence entre :
- un simple CRUD générique
- et une API interne pensée pour les opérateurs
Le back-office n'a pas seulement besoin de lire des commandes. Il a besoin d'exécuter des actions métier utiles.
Étape 7 — Brancher les routes
Dans orders/urls.py :
from rest_framework.routers import DefaultRouter
from .views import BackOfficeOrderViewSet
router = DefaultRouter()
router.register("backoffice/orders", BackOfficeOrderViewSet, basename="backoffice-order")
urlpatterns = router.urls
Dans opsdesk/urls.py :
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", include("orders.urls")),
]
Étape 8 — Configurer un admin Django utile tout de suite
Dans orders/admin.py :
from django.contrib import admin
from .models import CustomerOrder, OrderEvent
@admin.register(CustomerOrder)
class CustomerOrderAdmin(admin.ModelAdmin):
list_display = ("reference", "customer", "status", "total_amount", "created_at")
list_filter = ("status",)
search_fields = ("reference", "customer__username")
@admin.register(OrderEvent)
class OrderEventAdmin(admin.ModelAdmin):
list_display = ("order", "event_type", "created_by", "created_at")
list_filter = ("event_type",)
search_fields = ("order__reference",)
Pourquoi ? Parce que c'est ici qu'on voit l'un des grands atouts de Django : tu obtiens immédiatement une interface interne exploitable, même avant d'avoir développé un vrai back-office sur mesure.
29. Vérification guidée
Lancer le projet
python manage.py createsuperuser
python manage.py runserver
Vérifier l'admin
Ouvrir :
http://127.0.0.1:8000/admin/
Créer :
- un utilisateur client
- une commande associée à ce client
- éventuellement un utilisateur staff pour les opérations internes
Vérifier l'API back-office
Un utilisateur staff doit pouvoir lister les commandes :
curl -u staffuser:password http://127.0.0.1:8000/api/backoffice/orders/
Marquer une commande comme payée :
curl -u staffuser:password -X POST \
http://127.0.0.1:8000/api/backoffice/orders/1/mark_paid/
Puis l'expédier :
curl -u staffuser:password -X POST \
http://127.0.0.1:8000/api/backoffice/orders/1/ship/
Vérifier qu'un non-staff est bloqué
La requête de listing ou d'action exécutée avec un utilisateur non staff doit renvoyer 403 Forbidden.
Ce que tu dois observer
- l'admin permet une exploitation rapide des données
- l'API back-office permet des actions métier ciblées
- seuls les comptes internes peuvent utiliser cette API
- les événements internes gardent une trace de ce qui a été fait
30. Ce que cet exemple t'apprend vraiment
Cet exemple montre concrètement comment Django et DRF se complètent dans ce use case :
- l'admin Django donne un poste de pilotage immédiat
- le modèle structure les commandes et les événements internes
- le serializer façonne une réponse exploitable par un back-office
- la permission staff-only protège les opérations internes
- les actions DRF matérialisent les gestes métier des équipes
Autrement dit, on ne parle plus seulement d'admin Django comme d'un bonus : on voit comment il s'articule avec une API interne plus ciblée pour faire tourner un produit réel.
Si tu comprends bien cet exemple, tu commences à voir que l'exploitation interne n'est pas un détail annexe du produit : c'est une partie essentielle de sa qualité et de sa maintenabilité.