1. Créez une catégorie pour l'exercice
- Ouvrez Notes de formation → Catégories.
- Cliquez sur Nouveau.
- Saisissez Personnel, puis enregistrez.
Vous venez d'administrer une catégorie avec le modèle training.note.category. Odoo ajoute la ligne dans training_note_category ; vous n'avez exécuté aucune instruction SQL d'écriture.
2. Reliez la note de départ à cette catégorie
- Ouvrez Notes de formation → Notes, puis la note Bienvenue.
- Dans le field Catégorie, choisissez Personnel.
- Dès que la valeur change, repérez l'indicateur d'état dans la barre supérieure de la fiche. Cliquez sur son icône en forme de nuage, dont l'infobulle indique Enregistrer manuellement.
- Revenez à la liste, puis rouvrez Bienvenue.
Résultat attendu : la fiche affiche toujours Personnel. Odoo a écrit la référence de la catégorie dans category_id avec l'ORM. La note Bienvenue reste une donnée de départ décrite dans le XML du module ; gardez-la pour cette démonstration de relation.
3. Comprenez pourquoi la fiche est modifiable
Dans notre XML, la racine est simplement <form>. En Odoo 19, ses attributs create, edit et delete valent true par défaut : il n'est donc pas nécessaire d'ajouter edit="true". Les trois fields de la fiche ne portent pas non plus l'attribut readonly.
La fiche standard s'ouvre alors directement avec ses fields modifiables ; ne cherchez pas un bouton séparé pour passer en mode édition. Lorsque vous changez une valeur, l'indicateur d'état de la barre supérieure permet de forcer la sauvegarde avec l'icône en forme de nuage. Odoo peut aussi sauvegarder en quittant une fiche, mais utilisez ici l'enregistrement manuel afin de rendre chaque étape visible.
Les attributs de la view ne sont pas des permissions de sécurité. La ligne access_training_note_user du CSV accorde ici perm_create, perm_read, perm_write et perm_unlink aux utilisateurs internes. Odoo vérifie ces droits et les éventuelles record rules lorsque l'ORM manipule un record.
4. Choisissez d'abord les écrans standard pour le CRUD
Pour le travail ERP interne courant — créer, consulter, modifier et supprimer des records — les views list et form reliées à une action sont le choix par défaut. Elles apportent immédiatement la navigation, les gestes CRUD et l'intégration aux droits Odoo. Ne reconstruisez pas ces écrans en code personnalisé sans besoin précis.
Les trois approches de cette journée sont complémentaires. Elles affichent le même model training.note, passent par le même ORM et respectent les mêmes droits ; leur présentation et leur niveau d'interaction changent.
| Approche | À choisir pour | Force | Limite |
|---|---|---|---|
Views standard list/form et action | Le CRUD normal dans le back-office interne | Peu de code, comportement cohérent et contrôles d'accès Odoo appliqués | Mise en page et interactions cadrées par les composants standard |
| QWeb rendu par le serveur | Une page HTML maîtrisée, produite côté serveur | Structure HTML contrôlée et données préparées par le contrôleur | Le contrôleur, le form et leur sécurité doivent être conçus explicitement |
| Owl dans le client web | Une interaction plus riche et réactive dans le navigateur | État interactif et mise à jour de l'écran sans rechargement complet | Davantage de JavaScript, d'assets et de tests à maintenir |
QWeb et Owl ne remplacent donc pas le back-office standard. Utilisez-les lorsque leur forme de page ou leur interactivité répond à un besoin que les views ordinaires ne couvrent pas simplement.
5. Parcourez les quatre opérations CRUD
Create : créez une note temporaire
- Dans la liste Notes, cliquez sur Nouveau.
- Saisissez Note de test CRUD dans Titre.
- Saisissez Version 1 : note créée depuis le formulaire. dans Contenu.
- Choisissez Personnel dans Catégorie, puis cliquez sur l'icône de sauvegarde manuelle.
- Revenez à la liste.
Résultat attendu : une ligne Note de test CRUD apparaît avec la catégorie Personnel. Cette note vient du formulaire : elle n'existe pas dans data/training_note_data.xml.
Read : retrouvez exactement le même record
- Cliquez sur la ligne Note de test CRUD.
- Vérifiez le titre, le contenu et la catégorie, puis revenez à la liste.
- Dans pgAdmin, ouvrez Query Tool. Avec
psql, utilisez la même requête dans votre base d'exercice.
SELECT note.id, note.title, note.body, category.name AS category
FROM training_note AS note
LEFT JOIN training_note_category AS category
ON category.id = note.category_id
WHERE note.title = 'Note de test CRUD';Résultat attendu : une seule ligne contient le titre, le contenu de version 1 et la catégorie Personnel. Notez son id : l'opération suivante modifiera cette ligne au lieu d'en créer une autre.
Update : modifiez puis vérifiez la persistance
- Rouvrez Note de test CRUD.
- Remplacez le titre par Note de test CRUD — vérifiée.
- Remplacez le contenu par Version 2 : modification enregistrée avec l'ORM. et gardez la catégorie Personnel.
- Cliquez sur l'icône de sauvegarde manuelle, revenez à la liste, puis rouvrez la note sous son nouveau titre.
Résultat attendu dans Odoo : la liste et la fiche montrent le nouveau titre et le contenu de version 2. La catégorie Personnel est toujours sélectionnée.
SELECT note.id, note.title, note.body, category.name AS category
FROM training_note AS note
LEFT JOIN training_note_category AS category
ON category.id = note.category_id
WHERE note.title = 'Note de test CRUD — vérifiée';Résultat attendu dans PostgreSQL : l'id est le même que celui noté après la création. Le titre et le contenu ont changé ; la catégorie reste Personnel. Il s'agit bien d'une mise à jour du record existant.
Delete : supprimez uniquement la note de l'exercice
Supprimez uniquement Note de test CRUD — vérifiée. Ne supprimez pas Bienvenue, Observer avant de modifier ni Une base d'exercice : ces records viennent du XML et une mise à niveau du module peut les recréer avec un nouvel id. Dans l'interface standard, la suppression n'a pas d'annulation ordinaire ; retrouver exactement le record demanderait de restaurer une sauvegarde de la base d'exercice.
- Ouvrez la fiche Note de test CRUD — vérifiée.
- Dans la barre supérieure, ouvrez le menu Actions, représenté par une icône en forme d'engrenage.
- Choisissez Supprimer, relisez la confirmation, puis confirmez.
Résultat attendu dans Odoo : vous revenez à la liste et la ligne Note de test CRUD — vérifiée n'y apparaît plus.
SELECT id, title
FROM training_note
WHERE title = 'Note de test CRUD — vérifiée';Résultat attendu dans PostgreSQL : la requête ne renvoie aucune ligne. L'interface n'a pas simplement masqué la note : le client web a demandé la suppression du record training.note. L'ORM a appelé unlink(), vérifié le droit perm_unlink et les éventuelles record rules, puis appliqué le cycle de suppression du modèle.
Python décrit les modèles et leur relation. XML construit les écrans. L'utilisateur crée, lit, modifie ou supprime les données dans Odoo. L'ORM applique le cycle du modèle et ses permissions. PostgreSQL conserve l'état restant ; nos requêtes SELECT servent uniquement à l'observer.
6. Vérification finale
- Create : la note temporaire est apparue dans la liste et dans PostgreSQL.
- Read : la liste, la fiche et le
SELECTont montré le même record. - Update : le titre et le contenu ont changé sans changer l'
id; la catégorie Personnel a persisté. - Delete : la note d'exercice a disparu de la liste et la requête ne renvoie plus son
id.