- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Deviens membre Premium magic_button
Débloque cette session en devenant Membre Premium 🚀
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte personlive_helpToutes les questions
Gabriel Trouvé
9 février 2023 - 09 février 2023 à 22:36
checkConversation résolue
6 réponses
Django : importer User pour la ForeignKey
Bonsoir,1ere question : Donc pour importer le modèle User j'ai vu deux façons de faire.C'est vraiment 2 choix possibles ?Il n'est pas préférable d'utiliser une façon plutôt que l'autre ?Si …
00:00:00 :Dans cette partie, on va voir peut-être ce qui est le plus important pour notre application.J'ai nommé la création des modèles, donc la création de notre modèle qui va nous permettrede créer des articles de blog à l'intérieur de notre base de données.
00:00:12 :Donc pour ça, je vais ouvrir le fichier models.pyqui a été automatiquement créé lors de la création de mon application Post.Donc dans Post ici, je double-clic sur models.py pour l'ouvrir.
00:00:22 :On va enlever ce commentaire ici et on va créer notre classe,donc on va l'appeler BlogPost tout simplementet elle va hériter de models.models.Donc normalement, cet import est déjà effectué au début de votre fichier.
00:00:32 :Si ce n'est pas le cas, vous pouvez l'ajouter.Donc from django.db import models.Donc qu'est-ce qu'on va faire à l'intérieur de ce modèle ?On va spécifier différents champs.
00:00:42 :On va spécifier un titre, un slug, un auteur.On va également spécifier deux champs pour la date de notre article.Un champ qui va s'appeler last updated qui va contenir les informationsde la dernière fois à laquelle on a modifié notre article.
00:00:56 :Donc c'est un champ qui va être automatiquement mis à jouret un autre champ qui va s'appeler created on que l'on va pouvoir modifieret qui va contenir la date de publication que l'on souhaite afficher pour l'article.
00:01:06 :On va également avoir un statut pour indiquer si l'article est publié ou nonet bien entendu le contenu de notre article.Donc on va créer tous ces champs ici à l'intérieur de ma classe.
00:01:16 :Donc on va créer un champ title qui va être un champ de type Charfield.On va lui donner une longueur maximale de 255.On va dire qu'il doit être unique donc on va passer le paramètre unique à truepuisqu'on ne veut pas avoir deux articles qui puissent avoir le même titre.
00:01:31 :Et on va également renseigner directement ici un paramètre qui s'appelle verbose name.Donc ça c'est le nom qui va être affiché à plusieurs endroitsdonc que ce soit dans l'interface d'administration ou par exempledans les formulaires que l'on pourrait créer à partir de ce modèle.
00:01:45 :Donc ici je vais mettre un nom en français pour que dans notre interface d'administrationle nom soit affiché en français donc je vais mettre titre pour le verbose name.
00:01:53 :On va ensuite créer un slug donc le slug c'est la version du titrequi va être utilisée à l'intérieur des URL pour pouvoir accéder à nos articles.
00:02:01 :Donc à partir de models on va créer un slug field cette fois-ci.Le max length on va également le mettre à 255.On va également spécifier qu'il doit être unique et on va mettre blank à true.
00:02:12 :Donc ça veut dire qu'on n'est pas obligé d'avoir un slug de spécifié pour notre modèle.Donc on pourrait laisser ce champ vide et ça ne nous empêcherait pas de créer notre article de blog.
00:02:22 :On va ensuite créer un champ qui va nous permettre d'associer un auteur à cet article.Donc ça va être un champ avec une clé étrangère.
00:02:29 :Donc cette clé étrangère il va déjà falloir la récupérer.Cette clé étrangère ça va être l'utilisateur donc le modèle d'utilisateur de notre projet.Alors pour ça on va utiliser une fonction qui s'appelle get user modelqui va nous permettre de récupérer le modèle utilisateur utilisé par notre projet.
00:02:46 :Donc je vais le mettre dans une variable que je vais appeler user et cette fonction va l'importer.Donc on va utiliser PyCharm ici en cliquant sur l'ampoule rouge pour l'importer automatiquementdepuis le bon module. Donc le module qui s'appelle django.contrib.hot.
00:02:58 :Donc on clique et on a l'import qui se fait automatiquement.Donc from django.contrib.hot import get user model.Si vous voulez voir ce que fait cette fonction on peut faire un clic droit dans PyCharm,go to et on va cliquer sur declaration or usage ici.
00:03:11 :Et ça va nous envoyer automatiquement dans le fichier qui contient cette fonction.Et là en fait ce que ça fait c'est tout simplement aller récupérer dans le fichier de settingscette variable hot user model.
00:03:21 :Donc on pourrait utiliser directement cette variable à la place de la fonction.Donc l'utiliser directement dans le champ qu'on va créer.Il y a plusieurs façons de faire ça c'est une des façons qui est recommandée par ladocumentation de Django.
00:03:32 :Donc d'utiliser directement cette fonction qui va faire des choses en plus.Donc vous voyez qu'on a un try except ici.Donc elle va dans le cas où elle ne trouve pas cette valeur nous retourner une erreur.
00:03:41 :Donc je préfère passer ici par cette fonction.Dans notre cas on va utiliser le modèle d'utilisateur de base de Django.On ne va pas en créer un personnalisé.
00:03:49 :Donc je peux juste faire ça ici pour récupérer ce modèle et l'utiliser pour le champ d'auteur.Donc je vais mettre un champ d'auteur ici qui va être égal à foreign key.
00:03:58 :Donc une clé étrangère.On va lier donc à user.Donc user c'est ce qu'on a récupéré ici.Ça va être le modèle d'utilisateur de notre application.
00:04:05 :Et on va spécifier ici un paramètre qui est on delete.Ce paramètre il est obligatoire quand vous créez une relation foreign key.Ça va en fait être un paramètre qui va spécifier ce qu'il se passe lorsqu'on vasupprimer un utilisateur.
00:04:18 :Donc si jamais vous avez un utilisateur qui est relié à cet article et que vous supprimezl'utilisateur, qu'est-ce que vous souhaitez faire ?Dans beaucoup de formations vous allez voir les gens mettre modèle cascade comme ceci.
00:04:28 :Moi je ne vous conseille pas de mettre ça.Alors modèle cascade qu'est-ce que ça va faire ?En fait ça va signifier que si vous supprimez l'utilisateur relié à vos articles,les articles seront également supprimés.
00:04:38 :Alors je ne sais pas si vous êtes sûr que c'est vraiment le comportement que vous souhaitez.Ça peut être très pratique mais j'ai vu beaucoup de projets en fait perdre des donnéesà cause de ça parce que les gens mettaient tout le temps modèle cascade à l'intérieurdes relations avec une foreign key.
00:04:50 :Le problème c'est que si quelqu'un supprime l'utilisateur dans votre base de données,tous les articles associés vont également être supprimés.Donc moi ce que je préfère c'est à la place mettre set null et set null ça va,plutôt que de supprimer l'article, mettre null dans le champ de l'auteur.
00:05:05 :Donc l'article va être conservé et on n'aura tout simplement aucun auteur quisera assigné à cet article.Donc comme ça, ça vous laisse le choix par la suite de réassigner par exemple cesarticles à d'autres auteurs qui sont toujours présents dans votre application.
00:05:17 :Donc quand vous mettez set null ici dans le on delete, il va falloir bien entendurajouter le paramètre null à true puisque on veut pouvoir indiquer dans notre base dedonnées une valeur nulle, donc une valeur qui n'est pas définie sur ce champ.
00:05:30 :Donc si vous mettez set null ici, il faut obligatoirement mettre null à true.Si vous ne le faites pas, quand vous allez créer votre modèle, Django va vous l'indiquer,il va vous mettre une erreur et vous expliquer de façon assez claire que si vous mettez doncset null ici, il faut avoir null à true également.
00:05:43 :Également ce que je vais mettre c'est blank à true puisqu'on veut pouvoir ne pas forcémentspécifier d'auteur pour un article.Donc on veut en fait quand on crée un article, pouvoir laisser ce champ vide sans que cela nepose de problème.
00:05:56 :Si jamais vous voulez créer un article en fait et que vous ne savez pas encore quelauteur va être assigné à cet article, eh bien vous pouvez mettre blank égal à true ici.
00:06:03 :Comme ça l'article pourra être créé même si vous n'avez pas d'auteur.On va ensuite créer donc les deux champs pour la date et l'heure,donc le champ last updated qui va être un champ de type date time field et qui va êtreavec auto now égal à true.
00:06:18 :Donc c'est très pratique pour avoir un champ qui automatiquement va être mis à jour àchaque modification.Si vous souhaitez par exemple afficher dans votre blog la date et l'heure à laquelle unarticle a été modifié, eh bien on pourra utiliser ce champ.
00:06:30 :On va également créer donc un autre champ que je vais appeler created on qui cette fois-ci vaêtre déterminé par l'utilisateur.Donc ça c'est quand même très pratique puisque last updated avec auto now ici on ne va paspouvoir le modifier, mais parfois on pourrait avoir envie de spécifier une date même si on a
00:06:46 :écrit l'article le 1er janvier, on pourrait que dans l'interface, dans le blog en fait,ce ne soit pas cette date qui soit indiquée mais plutôt le 10 janvier si on souhaite avoir uncontrôle sur la date de publication des articles.
00:06:57 :Donc c'est pour ça que moi je préfère rajouter un champ ici created on sur lequel je vais avoirce contrôle.Donc ce champ dans ce cas-ci je vais faire juste un date field puisque je ne vais pasindiquer l'heure de publication mais juste la date.
00:07:08 :Donc date field au lieu de date time field et on va ici spécifier blank égale true et nulleégale true.Donc ça, ça va faire en sorte qu'on pourra en fait ne pas spécifier de date.
00:07:18 :Donc là encore si jamais vous voulez créer un article sans forcément tout de suite mettre unedate, eh bien vous pouvez mettre blank égale à true ici.
00:07:25 :Et comme on a un type de données ici qui n'est pas une chaîne de caractère, donc un champ detype date ici, il va falloir également spécifier nulle égale true puisque dans le cas d'un champqui va être vide, comme on a un champ de type date field ici, vous ne pouvez pas mettre une
00:07:39 :chaîne de caractère vide.Donc dans la base de données il va falloir pouvoir indiquer une valeur nulle et donc quandvous mettez sur un champ comme celui-ci blank, vous êtes obligé également de mettre nulleégale à true.
00:07:49 :On va ensuite créer tout simplement un boolean publish donc qui va être égal à models.booleanfield.Par défaut on va le mettre à false donc ça veut dire que quand on crée un article pardéfaut il ne va pas être publié et on pourra par la suite choisir de modifier ce statut pour
00:08:04 :publier notre article et l'afficher sur notre blog.Là encore on va modifier le verbose name et on va mettre publié.Et le dernier champ qu'on va créer c'est le champ du contenu.
00:08:14 :Donc on va créer un champ content qui va être égal cette fois-ci à un textfield.Donc textfield qui nous permet de rentrer un peu plus d'informations que les charfieldsqui eux ont une longueur maximale que l'on spécifie ici avec ce paramètre.
00:08:24 :Donc ce qu'on va faire ici c'est également spécifier blank égale true.Dans ce cas-ci on n'est pas obligé de mettre nulle égale true puisqu'il s'agit d'un typetexte donc un champ de type texte ici.
00:08:33 :Donc dans notre base de données si on ne rentre rien pour ce champ automatiquementDjango va mettre une chaîne de caractère vide.Donc on n'est pas obligé de spécifier nulle égale true dans ce cas-ci.
00:08:42 :On va également modifier le verbose name et on va mettre contenu tout simplement.Donc le nom de ce champ ici en français.Donc voilà pour tous les champs de notre modèle de blog.
00:08:52 :Je vais également rajouter quelques informations ici.On va rajouter une classe méta qui va nous permettre de spécifier plusieurs choses.Déjà en fait l'ordre dans lequel les articles doivent être affichés dansl'interface d'administration.
00:09:04 :Donc je vais ici créer une liste et on va mettre moins created on.Donc ça veut dire qu'on va afficher les articles par défaut avec leur date de créationet on met le moins ici pour que ce soit l'inverse, donc l'ordre inverse.
00:09:15 :Donc pour que les articles qui ont été publiés en dernier soient au début de ma liste.On va également spécifier le verbose name.Donc cette fois-ci le verbose name de notre modèle au complet.
00:09:25 :Donc le modèle blog post ici et non pas le verbose name d'un champ en particulier.Et ici on va mettre article puisque par défaut dans l'interface d'administration c'est le nomde notre modèle qui va être utilisé donc blog post.
00:09:35 :Donc pour avoir quelque chose d'un peu plus explicite dans l'interface d'administration,je préfère ici mettre article.On va également créer une méthode string qui va me permettre de retourner tout simplementle titre de l'article.
00:09:47 :Donc plutôt que d'avoir un affichage avec l'identifiant donc la clé primaire en faitde notre article dans la base de données, on va utiliser le titre de l'article pourque ce soit là encore un peu plus explicite dans l'interface d'administration.
00:09:59 :Dernière chose que je vais faire, je vais surcharger la méthode save,la méthode qui est en fait utilisée à chaque fois que l'on va sauvegarder notre article dansla base de données puisque ce que je veux faire c'est modifier automatiquement le slug sil'utilisateur n'en spécifie pas un.
00:10:12 :Donc pour ça je vais surcharger save.On va mettre ici les args et les quarks puisqu'il peut y avoir potentiellement plusieurs élémentsqui sont envoyés à cette méthode.
00:10:22 :Pour l'instant on va juste utiliser super et on va appeler la méthode save, donc grâce à super,donc la méthode save de notre classe, donc de notre classe modèle ici dont on hérite.
00:10:31 :Je vais repasser les args et les quarks à cette méthode et avant ça, donc avant le super,on va modifier notre slug s'il n'est pas spécifié.
00:10:40 :Donc on va dire if not self.slug, donc si on n'a pas spécifié de slug au moment dela création ou de la modification d'un article et bien on va en créer un automatiquement.
00:10:49 :Donc on va faire self.slug égale à slugify de self.title.Donc slugify c'est une fonction qui est disponible à l'intérieur d'un module deDjango donc pour ça on va l'importer tout en haut ici.
00:11:01 :On va faire from django.template.defaultfilters import slugify.Et donc ça c'est une fonction qui est une fonction que l'on peut utiliser en tant quefiltre à l'intérieur des gabarits de Django, donc moi je vais l'utiliser directement àl'intérieur de mon modèle ici pour transformer automatiquement notre titre en slug.
00:11:19 :Par exemple si on a un titre ici qui est un premier article comme ceci,et bien le slugify va le transformer en un tiret premier tiret article.
00:11:30 :Donc il va remplacer tout en minuscules et il va mettre des tirets à la place des espaces.Donc comme ça on pourra utiliser ce slug dans l'adresse pour accéder,donc dans l'adresse url pour accéder à notre article.
00:11:40 :Donc si on n'a pas de slug on modifie le champ slug de mon article avec slugify denotre titre et ensuite on sauvegarde tout ça dans notre base de données.
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.