public:appro-s7:td_web:final

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
public:appro-s7:td_web:final [2023/10/30 22:51] edaucepublic:appro-s7:td_web:final [2023/11/04 18:22] (Version actuelle) edauce
Ligne 1: Ligne 1:
-Finaliser votre application+==== 15. Finaliser votre application ====
  
 Nous avons déjà franchi toutes les étapes nécessaires à la création de notre site web : nous savons maintenant comment écrire un modèle, une URL, une vue et un template. Nous avons même réussi à rendre notre site web plus joli . Nous avons déjà franchi toutes les étapes nécessaires à la création de notre site web : nous savons maintenant comment écrire un modèle, une URL, une vue et un template. Nous avons même réussi à rendre notre site web plus joli .
Ligne 7: Ligne 7:
 Tout d'abord, il faudrait que notre blog possède une page qui permet d'afficher un billet, n'est-ce pas ? Tout d'abord, il faudrait que notre blog possède une page qui permet d'afficher un billet, n'est-ce pas ?
  
-Nous avons déjà un modèle Billet, nous n'avons donc pas besoin d'ajouter quoi que ce soit à models.py. +Nous avons déjà un modèle ''Billet'', nous n'avons donc pas besoin d'ajouter quoi que ce soit à ''models.py''.
-Créer un lien dans un template+
  
-Nous allons tout d'abord ajouter un lien à l'intérieur du fichier blog/templates/blog/post_list.html. Ouvrez-le dans l’éditeur de code et voyez qu'il devrait ressembler à ceci :+=== Créer un lien dans un template ===
  
-blog/templates/blog/post_list.html+Nous allons tout d'abord ajouter un lien à l'intérieur du fichier ''blog/templates/blog/post_list.html''. Ouvrez-le dans l’éditeur de code et voyez qu'il devrait ressembler à ceci :
  
 +''blog/templates/blog/post_list.html''
 +<code html>
 {% extends 'blog/base.html' %} {% extends 'blog/base.html' %}
  
Ligne 27: Ligne 28:
     {% endfor %}     {% endfor %}
 {% endblock %} {% endblock %}
 +</code>
  
-Nous aimerions pouvoir cliquer sur le titre du billet et arriver sur une page avec le contenu de celui-ci. Pour cela, changeons <h2><a href="">{{ billet.title }}</a></h2> pour qu'il pointe vers la page de contenu du billet : +Nous aimerions pouvoir cliquer sur le titre du billet et arriver sur une page avec le contenu de celui-ci. Pour cela, changeons ''<h2><a href="">{{ billet.title }}</a></h2>'' pour qu'il pointe vers la page de contenu du billet :
- +
-blog/templates/blog/post_list.html+
  
 +''blog/templates/blog/post_list.html''
 +<code html>
 <h2><a href="{% url 'post_detail' pk=billet.pk %}">{{ billet.title }}</a></h2> <h2><a href="{% url 'post_detail' pk=billet.pk %}">{{ billet.title }}</a></h2>
 +</code>
  
-C'est le moment parfait pour expliquer ce mystérieux {% url 'post_detail' pk=billet.pk %}. Vous vous souvenez peut-être que la notation {% %} nous permet d'utiliser les balises de template Django. Cette fois-ci, nous allons utiliser des balises qui vont s'occuper de créer des URLs à notre place !+C'est le moment parfait pour expliquer ce mystérieux ''{% url 'post_detail' pk=billet.pk %}''. Vous vous souvenez peut-être que la notation ''{% %}'' nous permet d'utiliser les balises de template Django. Cette fois-ci, nous allons utiliser des balises qui vont s'occuper de créer des URLs à notre place !
  
-La partie post_detail signifie que Django s'attend de trouver une URL en blog/urls.py avec nom = post_detail+La partie post_detail signifie que Django s'attend de trouver une URL en ''blog/urls.py'' avec ''nom = post_detail''
  
-Et qu’en est-il de pk=billet.pk ? pk est l’abréviation de clé primaire (« primary key » en anglais), qui est un identifiant unique pour chaque entrée dans une base de données. Chaque modèle Django a un champ qui sert de clé primaire, et peu importe son autre nom, il peut aussi être appelé par le nom « pk ». Comme nous n’avons pas spécifié de clé primaire dans notre modèle Billet, Django en crée une pour nous (par défaut, un champ nommé « id » contenant un nombre qui augmente pour chaque entrée, c’est-à-dire 1, 2, 3, etc.) et l’ajoute comme champ à chacun de nos billets. Nous accédons à la clé primaire en écrivant billet.pk, pareil que pour accéder aux autres champs (title, author, etc.) de notre objet Billet !+Et qu’en est-il de ''pk=billet.pk'' ''pk'' est l’abréviation de clé primaire (« primary key » en anglais), qui est un identifiant unique pour chaque entrée dans une base de données. Chaque modèle Django a un champ qui sert de clé primaire, et peu importe son autre nom, il peut aussi être appelé par le nom « pk ». Comme nous n’avons pas spécifié de clé primaire dans notre modèle Billet, Django en crée une pour nous (par défaut, un champ nommé « id » contenant un nombre qui augmente pour chaque entrée, c’est-à-dire 1, 2, 3, etc.) et l’ajoute comme champ à chacun de nos billets. Nous accédons à la clé primaire en écrivant billet.pk, pareil que pour accéder aux autres champs (title, author, etc.) de notre objet Billet !
  
-Maintenant si nous jetons un coup d’œil à http://127.0.0.1:8000/, nous rencontrons une erreur. Ceci est prévisible, puisque nous n'avons ni d'URL ni de view pour post_detail. L'erreur ressemble à ceci :+Maintenant si nous jetons un coup d’œil à ''http://127.0.0.1:8000/'', nous rencontrons une erreur. Ceci est prévisible, puisque nous n'avons ni d'URL ni de view pour post_detail. L'erreur ressemble à ceci :
  
-Erreur NoReverseMatch +{{https://tutorial.djangogirls.org/fr/extend_your_application/images/no_reverse_match2.png}}
-Créer une URL vers le contenu d'un billet+
  
-Allons créer notre URL dans le fichier urls.py pour notre vue post_detail !+=== Créer une URL vers le contenu d'un billet ===
  
-Nous aimerions que le contenu de notre premier billet s'affiche à cette URL : http://127.0.0.1:8000/billet/1/+Allons créer notre URL dans le fichier '''urls.py'' pour notre vue ''post_detail'' !
  
-Allons créer une URL dans le fichier blog/urls.py qui dirigera Django vers une vue appelée post_detail. Cela nous permettra d'afficher l'intégralité d'un billet de blogOuvrez le fichier blog/urls.py dans l’éditeur de code et ajoutez la ligne path('billet/<int:pk>/', views.post_detail, name='post_detail'), afin que le fichier ressemble à ceci :+Nous aimerions que le contenu de notre premier billet s'affiche à cette URL : ''http://127.0.0.1:8000/billet/1/''
  
-blog/urls.py+Allons créer une URL dans le fichier ''blog/urls.py'' qui dirigera Django vers une vue appelée ''post_detail''. Cela nous permettra d'afficher l'intégralité d'un billet de blog. Ouvrez le fichier ''blog/urls.py'' dans l’éditeur de code et ajoutez la ligne ''path('billet/<int:pk>/', views.post_detail, name='post_detail')'', afin que le fichier ressemble à ceci :
  
 +''blog/urls.py''
 +<code python>
 from django.urls import path from django.urls import path
 from . import views from . import views
Ligne 60: Ligne 64:
     path('billet/<int:pk>/', views.post_detail, name='post_detail'),     path('billet/<int:pk>/', views.post_detail, name='post_detail'),
 ] ]
 +</code>
 +La partie ''billet/<int:pk>/'' spécifie un modèle d’URL – allons voir plus dans le détail :
  
-La partie billet/<int:pk>/ spécifie un modèle d’URL – allons voir plus dans le détail :+  *  billet/ signifie que l’URL doit commencer par le mot billet suivie d’un /. OK, pas très compliqué. 
 +  *  <int:pk>– cette partie est plus délicate. Cela signifie que Django s’attend à une valeur entière (int), qu'en suite il transférera à une vue comme variable de nom pk. 
 +  *  – il nous faut un / à nouveau avant la fin de l’URL.
  
-    billet/ signifie que l’URL doit commencer par le mot billet suivie d’un /. OK, pas très compliqué. +Concrètement, cela signifie que si vous entrez ''http://127.0.0.1:8000/billet/5/'' dans votre barre d'adresse, Django va comprendre que vous cherchez à atteindre une vue appelée post_detail et qu'il doit communiquer à cette vue que pk est égal à 5.
-    <int:pk>– cette partie est plus délicateCela signifie que Django s’attend à une valeur entière (int), qu'en suite il transférera à une vue comme variable de nom pk+
-    / – il nous faut un / à nouveau avant la fin de l’URL.+
  
-Concrètementcela signifie que si vous entrez http://127.0.0.1:8000/billet/5/ dans votre barre d'adresse, Django va comprendre que vous cherchez à atteindre une vue appelée post_detail et qu'il doit communiquer à cette vue que pk est égal à 5.+OKnous avons ajouté un nouveau modèle d’URL à ''blog/urls.py'' ! Actualisons la page : ''http://127.0.0.1:8000/'' Boom ! Le serveur a cessé de marcher à nouveauJetez un oeil sur la console – comme prévu, il y a encore une autre erreur !
  
-OK, nous avons ajouté un nouveau modèle d’URL à blog/urls.py ! Actualisons la page : http://127.0.0.1:8000Boom ! Le serveur a cessé de marcher à nouveauJetez un oeil sur la console – comme prévu, il y a encore une autre erreur ! +{{https://tutorial.djangogirls.org/fr/extend_your_application/images/attribute_error2.png}}
- +
-AttributeError+
  
 Vous souvenez-vous de ce qu'il faut faire ensuite ? Il faut ajouter une vue ! Vous souvenez-vous de ce qu'il faut faire ensuite ? Il faut ajouter une vue !
-Ajouter une vue pour le contenu du billet+=== Ajouter une vue pour le contenu du billet ===
  
-Cette fois-ci, nous allons donner un paramètre supplémentaire à notre vue : pk. Notre vue va avoir besoin de le récupérer, n'est ce pas ? Pour cela, nous allons définir une fonction : def post_detail(request, pk):. Notez que ce paramètre doit avoir exactement le même nom que celui que nous avons spécifié dans le fichier urls (pk). Notez aussi qu’oublier de mettre cette variable est incorrect et produira une erreur !+Cette fois-ci, nous allons donner un paramètre supplémentaire à notre vue : pk. Notre vue va avoir besoin de le récupérer, n'est ce pas ? Pour cela, nous allons définir une fonction : ''def post_detail(request, pk):''. Notez que ce paramètre doit avoir exactement le même nom que celui que nous avons spécifié dans le fichier urls (pk). Notez aussi qu’oublier de mettre cette variable est incorrect et produira une erreur !
  
 Maintenant, nous aimerions obtenir qu'un seul billet de blog. Pour cela, nous allons utiliser des QuerySets qui ressemblent à ceux-ci: Maintenant, nous aimerions obtenir qu'un seul billet de blog. Pour cela, nous allons utiliser des QuerySets qui ressemblent à ceux-ci:
  
-blog/views.py +''blog/views.py'' 
 +<code python>
 Billet.objects.get(pk=pk) Billet.objects.get(pk=pk)
 +</code>
  
 Cependant, il y a un petit problème dans cette ligne de code. Si aucun de nos Billets ne possèdent cette primary key (clef primaire) (pk), nous allons nous retrouver avec une super erreur bien cracra! Cependant, il y a un petit problème dans cette ligne de code. Si aucun de nos Billets ne possèdent cette primary key (clef primaire) (pk), nous allons nous retrouver avec une super erreur bien cracra!
  
-Erreur DoesNotExist+{{https://tutorial.djangogirls.org/fr/extend_your_application/images/does_not_exist2.png}}
  
-Dans l'idéal, nous aimerions pouvoir éviter ça! Encore une fois, Django nous offre l'outil parfait pour ça : get_object_or_404. Dans le cas où il n'existerait pas de Billet avec le pk indiqué, une page d'erreur beaucoup plus sympathique s'affichera : c'est ce qu'on appelle une erreur 404 : page non trouvée.+Dans l'idéal, nous aimerions pouvoir éviter ça! Encore une fois, Django nous offre l'outil parfait pour ça : ''get_object_or_404''. Dans le cas où il n'existerait pas de Billet avec le pk indiqué, une page d'erreur beaucoup plus sympathique s'affichera : c'est ce qu'on appelle une erreur 404 : page non trouvée.
  
-Page non trouvée+{{https://tutorial.djangogirls.org/fr/extend_your_application/images/404_2.png}}
  
 La bonne nouvelle, c'est que vous pouvez créer vous-mêmes votre page Page non trouvée et en faire ce que vous voulez ! Reconnaissez que ce n'est pas le plus important pour le moment donc nous allons zapper cette partie ;). La bonne nouvelle, c'est que vous pouvez créer vous-mêmes votre page Page non trouvée et en faire ce que vous voulez ! Reconnaissez que ce n'est pas le plus important pour le moment donc nous allons zapper cette partie ;).
  
-Ok, ajoutons notre vue à notre fichier views.py!+Ok, ajoutons notre vue à notre fichier ''views.py''!
  
-Dans le fichier blog/urls.py nous avons crée un modèle d'URL post_detail qui fait référence à la vue views.post_detail. En conséquence, Django s'attend à qu'une fonction post_detail soit définie dans le fichier blog/views.py.+Dans le fichier ''blog/urls.py'' nous avons crée un modèle d'URL post_detail qui fait référence à la vue views.post_detail. En conséquence, Django s'attend à qu'une fonction post_detail soit définie dans le fichier ''blog/views.py''.
  
-Ouvrez maintenant le fichier blog/views.py dans l'éditeur de code et ajoutez la ligne suivante après les autres lignes du type from qui existent déjà : +Ouvrez maintenant le fichier ''blog/views.py'' dans l'éditeur de code et ajoutez la ligne suivante après les autres lignes du type from qui existent déjà :
- +
-blog/views.py+
  
 +''blog/views.py''
 +<code python>
 from django.shortcuts import render, get_object_or_404 from django.shortcuts import render, get_object_or_404
 +</code>
 A la fin du fichier nous ajoutons finalement notre view : A la fin du fichier nous ajoutons finalement notre view :
  
-blog/views.py +''blog/views.py'' 
 +<code python>
 def post_detail(request, pk): def post_detail(request, pk):
     billet = get_object_or_404(Billet, pk=pk)     billet = get_object_or_404(Billet, pk=pk)
     return render(request, 'blog/post_detail.html', {'billet': billet})     return render(request, 'blog/post_detail.html', {'billet': billet})
 +</code>
 +Hop, réactualisons la page ''http://127.0.0.1:8000/''
  
-Hop, réactualisons la page http://127.0.0.1:8000/ +{{https://tutorial.djangogirls.org/fr/extend_your_application/images/post_list2.png}}
- +
-Vue post_list+
  
 C'est bon, ça a marché ! Mais que ce passe-t-il lorsque nous cliquons sur un lien dans un titre de billet de blog ? C'est bon, ça a marché ! Mais que ce passe-t-il lorsque nous cliquons sur un lien dans un titre de billet de blog ?
  
-Erreur TemplateDoesNotExist+{{https://tutorial.djangogirls.org/fr/extend_your_application/images/template_does_not_exist2.png}}
  
 Oh non ! Encore une erreur ! Mais cette fois, vous savez quoi faire : nous avons besoin d'un template ! Oh non ! Encore une erreur ! Mais cette fois, vous savez quoi faire : nous avons besoin d'un template !
 Créer un template pour le contenu du billet Créer un template pour le contenu du billet
  
-Nous allons créer un fichier post_detail.html dans le dossier blog/templates/blog et nous l'ouvrons ensuite avec notre éditeur de code.+Nous allons créer un fichier ''post_detail.html'' dans le dossier ''blog/templates/blog'' et nous l'ouvrons ensuite avec notre éditeur de code.
  
 Entrez le code suivant : Entrez le code suivant :
  
-blog/templates/blog/post_detail.html +''blog/templates/blog/post_detail.html'' 
 +<code html>
 {% block content %} {% block content %}
     <div class="billet">     <div class="billet">
Ligne 140: Ligne 145:
     </div>     </div>
 {% endblock %} {% endblock %}
 +</code>
  
-Une nouvelle fois, nous faisons hériter de base.html. Dans le content block, nous voulons afficher la date de publication d'un billet (si elle existe), son titre et son texte. Mais vous souhaitez peut-être quelques éclaircissements avant, non?+Une nouvelle fois, nous faisons hériter de ''base.html''. Dans le content block, nous voulons afficher la date de publication d'un billet (si elle existe), son titre et son texte. Mais vous souhaitez peut-être quelques éclaircissements avant, non?
  
-{% if ... %} ... {% endif %} est une balise de template que nous pouvons utiliser si nous voulons vérifier quelque chose. (Vous souvenez-vous de if ... else .. que nous avons appris dans le chapitre Introduction à Python ?) Dans ce cas spécifique, nous voulons vérifier que published_date existe.+''{% if ... %} ... {% endif %}'' est une balise de template que nous pouvons utiliser si nous voulons vérifier quelque chose. (Vous souvenez-vous de if ... else .. que nous avons appris dans le chapitre Introduction à Python ?) Dans ce cas spécifique, nous voulons vérifier que published_date existe.
  
 Ok, vous pouvez maintenant actualiser votre page et voir si TemplateDoesNotExist a enfin disparu. Ok, vous pouvez maintenant actualiser votre page et voir si TemplateDoesNotExist a enfin disparu.
  
-Page détaillée d'un billet+{{https://tutorial.djangogirls.org/fr/extend_your_application/images/post_detail2.png}}
  
 Yay ! Ça marche! Yay ! Ça marche!
  • public/appro-s7/td_web/final.1698702689.txt.gz
  • Dernière modification : 2023/10/30 22:51
  • de edauce