Listing du fichier tp4.php
00001<?php
00002 # # (gH) -_- tp4.php ; TimeStamp (unix) : 24 Juin 2018 vers 20:54
00003 error_reporting(E_ALL | E_NOTICE | E_STRICT ) ;
00004 header('Content-Type "text/html; charset=iso-8859-1"') ;
00005 ini_set( 'default_charset', 'ISO-8859-1' );
00006 include("decra-inc.php") ;
00007
00008 $R = ghRouge("R") ;
00009 $XML = ghRouge("XML") ;
00010 $Awk = ghRouge("AWK") ;
00011 $Php = ghVert("PHP") ;
00012 $python = ghVert("Python") ;
00013
00014 $numSerie = 4 ;
00015 debutTP($numSerie,"MVC en $python via Django") ;
00016 ghAtAngers() ;
00017
00018 ## -------------------------------------------------------------------------------------------
00019
00020 sdl(3) ; echo cmt(' pour afficher toutes les solutions : tp1.php?solutions=1') ; sdl(3) ;
00021
00022 ## -------------------------------------------------------------------------------------------
00023
00024 p("texte") ;
00025 echo "" ;
00026 finp() ;
00027 debutSection() ;
00028
00029 $tableauDesRubriques = array() ;
00030 $idr = 0 ;
00031 $idr++; $tableauDesRubriques[$idr] = "Installation et test de Django (première partie)" ;
00032 $idr++; $tableauDesRubriques[$idr] = "Deuxième partie : base de données" ;
00033 $idr++; $tableauDesRubriques[$idr] = "Les vues (troisième partie)" ;
00034 $idr++; $tableauDesRubriques[$idr] = "Les formulaires (partie quatre)" ;
00035 $idr++; $tableauDesRubriques[$idr] = "Les tests (partie cinq) et la fin du tutoriel" ;
00036 $idr++; $tableauDesRubriques[$idr] = "Une application plus complète entièrement en français" ;
00037 $tdmCRLM = new tdm($tableauDesRubriques) ;
00038 $tdmCRLM->titre() ;
00039 $tdmCRLM->menu("oui","oui","nou") ;
00040
00041 direAfficherSolutionsTP($numSerie) ;
00042
00043 pvide() ;
00044
00045 p("texte gvertf") ;
00046 echo " On se propose ici de reproduire le début du tutoriel de Django, " ;
00047 echo " en version anglaise ".href("https://docs.djangoproject.com/en/2.1/intro/tutorial01/","ici") ;
00048 echo " et en version française ".href("https://docs.djangoproject.com/fr/2.1/intro/tutorial01/","là").". " ;
00049 finp() ;
00050
00051 p("texte gvertf") ;
00052 echo " Toutes les manipulations sont à faire dans un terminal, avec un éditeur de textes comme Geany ou Gedit." ;
00053 finp() ;
00054
00055 finSection() ;
00056
00057 $numExo = 0 ;
00058
00059 ## -------------------------------------------------------------------------------------------
00060
00061 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Installation et test de Django (première partie)
00062
00063 ## -------------------------------------------------------------------------------------------
00064
00065 blockquote() ; # tp
00066
00067 blockquote() ; # énoncé
00068
00069 p('texte') ;
00070 echo " Quels sont les deux sites les plus connus qui utilisent ".ghVert("Django")." ?" ;
00071 finp() ;
00072
00073 p("texte") ;
00074 echo "Dans un terminal, taper ".b("pip3 install django==2.1")."." ;
00075 finp() ;
00076
00077 p("texte") ;
00078 echo "Attendre que le système ait fini de télécharger et de décompresser l'archive pytz avant de continuer." ;
00079 finp() ;
00080
00081 pre_fichier("install-django.txt","cadre") ;
00082
00083 p("texte") ;
00084 echo "Que répond le système si on exécute ".b("python -m django --version")." ?" ;
00085 finp() ;
00086
00087 p("texte") ;
00088 echo "Ecrire l'alias suivant :" ;
00089 finp() ;
00090
00091 pre_fichier("django-alias1.txt","cadre") ;
00092
00093 p("texte") ;
00094 echo "Si le fichier ".b("~/.local/bin/django-admin")." existe, écrire l'alias suivant :" ;
00095 finp() ;
00096
00097 pre_fichier("django-alias2.txt","cadre") ;
00098
00099 p("texte") ;
00100 echo "Que répond désormais le système si on exécute ".b("python -m django --version")." ?" ;
00101 finp() ;
00102
00103 p("texte") ;
00104 echo ghVert(" Lire le début du tutoriel partie 1, jusqu'à ").b("python manage.py runserver")."." ;
00105 finp() ;
00106
00107 p("texte") ;
00108 echo " Commencer par créer un répertoire MVC-Django. " ;
00109 echo " Si, dans ce répertoire on exécute la commande ".b("django-admin startproject mysite") ;
00110 echo " combien de fichiers et de répertoires sont créés ?" ;
00111 echo " Quelles commandes Unix le prouvent ? Mettre dans ".b("liste1.txt")." la liste de tous les fichiers avec leur chemin d'accès relatif." ;
00112 finp() ;
00113
00114 p("texte") ;
00115 echo "Vérifier que, dans le répertoire mysite, la commande ".b("python manage.py runserver")." lance bien le serveur. " ;
00116 echo " A quelle URL est-il accessible ?" ;
00117 echo " Qu'affiche la page Web ?" ;
00118 echo " Qu'affiche le terminal si on ouvre la page d'index du serveur ?" ;
00119 finp() ;
00120
00121 p("texte") ;
00122 echo "Quels fichiers sont créés si on exécute, dans le répertoire mysite, la commande " ;
00123 echo b("python manage.py startapp polls")." ?" ;
00124 echo " Essayer de sauvegarder la liste des fichiers dans le fichier ".b("liste2.txt")." et " ;
00125 echo " comparer avec ".b("liste1.txt").". " ;
00126 finp() ;
00127
00128 p("texte") ;
00129 echo " Pourquoi faut-il exécuter ".b("python manage.py migrate")." ?" ;
00130 finp() ;
00131
00132 p("texte") ;
00133 echo ghVert("Lire la suite du tutoriel et recopier ce qui est mis dans le tutoriel pour l'écriture de la première vue").". " ;
00134 echo " Peut-on avoir comme texte ".b("Bonjour à tout le monde")." au lieu de ".b("Hello, world") ;
00135 echo " avec prise en compte de l'accent sur le a ?" ;
00136 finp() ;
00137
00138 p("texte") ;
00139 echo " Le code produit pour la page d'index est-il valide au sens de la grammaire XHTML 1.0 Strict ?" ;
00140 echo " Serait-ce difficile de le modifier pour qu'il le soit ?" ;
00141 echo " Est-ce simple de changer l'image affichée (la fusée) ?" ;
00142 finp() ;
00143
00144 p("texte") ;
00145 echo "Quelle erreur y a-t-il dans le tutoriel Django partie 1 ?" ;
00146 finp() ;
00147
00148 p("texte") ;
00149 echo " Quelle commande aurait-il fallu exécuter pour installer ".b("Django 2.0") ;
00150 echo " au lieu de ".b("Django 2.1")." ?" ;
00151 finp() ;
00152
00153 p("texte") ;
00154 echo ghRouge("Si l'installation ne fonctionne pas").", vous pouvez toujours regarder la série de vidéos " ;
00155 echo href("https://www.youtube.com/watch?v=LxEFgfPdhDg","Tutoriel Django Français")." ou la série " ;
00156 echo href("https://www.youtube.com/watch?v=UmljXZIypDc","Python Django Tutorial English").". " ;
00157 finp() ;
00158
00159 finblockquote() ; # énoncé
00160
00161 solutionTP($numExo,$numSerie) ;
00162
00163 p("texte") ;
00164 echo " Les deux sites les plus connus qui utilisent ".ghVert("Django")." sont sans doute " ;
00165 echo b("Instagram")." et ".b("Mozilla").". Pour d'autres sites basés sur ".ghVert("Django").", " ;
00166 echo " consulter par exemple ".href('https://www.netguru.co/blog/top-10-django-apps-and-why-companies-are-betting-on-this-framework',"top-10-django-apps")."." ;
00167 finp() ;
00168
00169 p("texte") ;
00170 echo em("A priori")." la commande ".b("python -m django --version") ;
00171 echo " affiche ".ghBleu("/usr/bin/python: No module named django ") ;
00172 echo " parce que ".b("python")." correspond à python 2. " ;
00173 echo " Une fois les alias définis, ou à l'aide de la commande ".b("python3 -m django --version") ;
00174 echo " donc avec un 3 au bout de python, on voit le numéro de version de django installé. Ce doit sans doute être " ;
00175 echo b("2.1.3")." ou ".b("2.2.7").". " ;
00176 finp() ;
00177
00178 p("texte") ;
00179 echo "Pour connaitre " ;
00180 echo " le nombre de fichiers et de répertoires créés suite " ;
00181 echo " à la commande ".b("django-admin startproject mysite") ;
00182 echo " on peut, sous Unix, utiliser des commandes comme ".ghRouge("ls -altR")." ou ".ghRouge("find .").". " ;
00183 echo " Si on dispose de la commande ".href("https://linux.die.net/man/1/tree","tree").", " ;
00184 echo " on peut se contenter de taper ".ghRouge("tree")." et obtenir : " ;
00185 finp() ;
00186
00187 pre_fichier("tree.txt","cadrejaune") ;
00188
00189 p("texte") ;
00190 echo "Pour enregistrer la liste des fichiers, la commande " ;
00191 echo " ".ghRouge("find . > liste1.txt").". " ;
00192 echo " est sans doute la plus adaptée. " ;
00193 echo " Voici ce que contient alors ". href("liste1.txt")." : " ;
00194 finp() ;
00195
00196 pre_fichier("liste1.txt","cadrebleu") ;
00197
00198 p("texte") ;
00199 echo " Le serveur est en principe à l'adresse " ;
00200 echo href(" http://127.0.0.1:8000/")." comme indiqué dans le tuteur et dans le terminal. " ;
00201 finp() ;
00202
00203 pre_fichier("django1.txt","cadrejaune") ;
00204
00205 p("texte") ;
00206 echo " La page Web affichée correspond à :" ;
00207 finp() ;
00208
00209 p() ;
00210 $img = "django1.png" ;
00211 nbsp(7) ;
00212 echo href($img,img($img,"",600)) ;
00213 finp() ;
00214
00215 p("texte") ;
00216 echo " L'ouverture de la page d'index affiche dans le terminal qui a lancé le serveur " ;
00217 echo " le texte suivant :" ;
00218 finp() ;
00219
00220 pre_fichier("django2.txt","cadrebleu") ;
00221
00222 p("texte") ;
00223 echo " Une fois la commande ".b("python manage.py startapp polls")." on dispose de nouveaux fichiers. " ;
00224 echo " Pour savoir lesquels, le mieux est sans doute d'enregistrer la liste des fichiers et d'utiliser " ;
00225 echo href("https://sourceforge.net/projects/tkdiff/","tkdiff") ;
00226 echo " pour comparer les deux listes de fichiers comme suit :" ;
00227 echo " ".ghRouge("find . > liste2.txt ; tkdiff liste1.txt liste2.txt &").". " ;
00228 echo " Voici ce que l'on voit alors : " ;
00229 finp() ;
00230
00231 p() ;
00232 $img = "django2.png" ;
00233 nbsp(7) ;
00234 echo href($img,img($img,"",600)) ;
00235 finp() ;
00236
00237
00238 p("texte") ;
00239 echo "Il est très simple d'afficher la page de départ des sondages en français comme ci-dessous" ;
00240 finp() ;
00241
00242 p() ;
00243 $img = "django3.png" ;
00244 nbsp(7) ;
00245 echo href($img,img($img,"",600)) ;
00246 finp() ;
00247
00248
00249 p("texte") ;
00250 echo "parce qu'il suffit de modifier la fonction ".b("index") ;
00251 echo " du fichier ".ghVert("polls/views.py")." et d'y mettre le texte en français." ;
00252 finp() ;
00253
00254
00255 p("texte") ;
00256 echo " Le code HTML n'est pas valide au sens de la grammaire XHTML 1.0 strict " ;
00257 echo " parce qu'il s'agit de code HTML 5 avec du CSS externe et interne, du SVG inline... " ;
00258 echo " Ce serait sans doute difficile à modifer parce qu'il ne semble pas y avoir de fichier " ;
00259 echo " index.html dans les fichiers créés." ;
00260 echo " La même remarque s'applique à l'image de la fusée par ce que c'est du SVG inline et pas un " ;
00261 echo " un fichier image inclus." ;
00262 finp() ;
00263
00264 p("texte") ;
00265 echo " L'erreur dans le tutoriel Django ".b("partie 1") ;
00266 echo " se situe dans la rubrique ".ghBleu("L'étape suivante est de faire pointer la configuration d'URL...") ;
00267 echo " parce que le texte dit de modifier ".ghRouge("mysite/urls.py") ;
00268 echo " alors que l'encadré fait référence à ".ghVert("monsite.urls.py") ;
00269 echo " donc avec ".b("monsite")." au lieu de ".b("mysite")." comme nom de répertoire." ;
00270 finp() ;
00271
00272 p("texte") ;
00273 echo " Pour installer ".b("Django 2.0") ;
00274 echo " au lieu de ".b("Django 2.1")." il faut écrire " ;
00275 echo ghVert("pip3 install Django==2.0").". " ;
00276 finp() ;
00277
00278 finsolution() ; # contient un blockquote
00279
00280 finblockquote() ; # tp
00281
00282 ## -------------------------------------------------------------------------------------------
00283
00284 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Deuxième partie : base de données
00285
00286 ## -------------------------------------------------------------------------------------------
00287
00288 blockquote() ; # tp
00289
00290 blockquote() ; # énoncé
00291
00292 p("texte") ;
00293 echo " Suivre ce qui est indiqué dans la " ;
00294 echo href("https://docs.djangoproject.com/fr/2.1/intro/tutorial02/","deuxième partie") ;
00295 echo " du tutoriel. On utilisera sqlite3 comme moteur de base de données avec " ;
00296 echo b("db.sqlite3")." comme nom de la base de données." ;
00297 finp() ;
00298
00299 p("texte") ;
00300 echo "Quels fichiers sont créés suite à la commande " ;
00301 echo b("python manage.py makemigrations polls")." ?" ;
00302 echo " Essayer de sauvegarder la liste de tous les fichiers dans le fichier ".b("liste4.txt").". " ;
00303 echo " Comment comparer ".b("liste2.txt")." de la question précédente et ".b("liste4.txt")." ? " ;
00304 finp() ;
00305
00306
00307 p("texte") ;
00308 echo " Dans la section " ;
00309 echo b("Jouer avec l'interface de programmation (API)").", " ;
00310 echo " essayer de mettre comme question ".b("Est-ce que tout va bien ?") ;
00311 echo " en plus de ".b("What's new?").". " ;
00312 finp() ;
00313
00314 p("texte") ;
00315 echo " Dans la section " ;
00316 echo b("Création d'un utilisateur administrateur").", " ;
00317 echo " essayer d'ajouter un utilisateur nommé ".b("tintin").". " ;
00318 finp() ;
00319
00320
00321 p("texte") ;
00322 echo " Comment dans le terminal lister la structure de toutes les tables SQL créées " ;
00323 echo " en mode interactif avec sqlite3 ?" ;
00324 echo " Et comment afficher tous " ;
00325 echo " les utilisateurs en mode interactif avec sqlite3 ?" ;
00326 echo " Et par programme, avec redirection du résultat dans ".b("listeUtilisateurs.txt")." ou dans ".b("liste3.txt")." ?" ;
00327 finp() ;
00328
00329 p("texte") ;
00330 echo " Qu'est-ce qui ne fonctionne pas dans cette partie du tutoriel dans les salles " ;
00331 echo " du département informatique ?" ;
00332 finp() ;
00333
00334 finblockquote() ; # énoncé
00335
00336 solutionTP($numExo,$numSerie) ; # contient un blockquote
00337
00338 p("texte") ;
00339 echo " A la suite de la commande " ;
00340 echo b("python manage.py makemigrations polls")." ?" ;
00341 echo " on peut voir les fichiers sont créés comme à la question précédente par " ;
00342 echo " ".ghRouge("find . > liste4.txt ; tkdiff liste1.txt liste4.txt &").". " ;
00343 echo " Voici ce que l'on voit alors : " ;
00344 finp() ;
00345
00346 p() ;
00347 $img = "tkdiff2.png" ;
00348 nbsp(7) ;
00349 echo href($img,img($img,"",600)) ;
00350 finp() ;
00351
00352 p("texte") ;
00353 echo " Pour mettre comme question ".b("Est-ce que tout va bien ?") ;
00354 echo " en plus de ".b("What's new?").", il suffit dans le shell de l'API d'écrire" ;
00355 finp() ;
00356
00357 pre_fichier("djangoShell.txt","cadrebleu") ;
00358
00359 p("texte") ;
00360 echo " Pour ajouter un utilisateur nommé ".b("tintin").", on peut utiliser le bouton + de la zone " ;
00361 echo " Add dans le panneau d'administration du site. " ;
00362 finp() ;
00363
00364 #pre_fichier("django3.txt","cadrebleu") ;
00365
00366 p() ;
00367 $img = "addUser.png" ;
00368 nbsp(7) ;
00369 echo href($img,img($img,"",600)) ;
00370 finp() ;
00371
00372 p("texte") ;
00373 echo " Dans le terminal, pour consulter la structure de toutes les tables créées, " ;
00374 echo " il faut écrire " ;
00375 finp() ;
00376
00377 pre_fichier("schema.txt","cadrebleu") ;
00378
00379 p("texte") ;
00380 echo " Et pour lister les utilisateurs en mode interactif avec sqlite3 " ;
00381 echo " on peut se contenter de " ;
00382 finp() ;
00383
00384 pre_fichier("django4.txt","cadrebleu") ;
00385
00386 p("texte") ;
00387 echo " Le programme associé " ;
00388 echo " doit ressembler au code ci-dessous, fichier ".href("users.sql3")." :" ;
00389 finp() ;
00390
00391 pre_fichier("django5.txt","cadrebleu") ;
00392
00393 p("texte") ;
00394 echo "Voici comment l'utiliser pour la redirection du résultat dans ".b("listeUtilisateurs.txt") ;
00395 finp() ;
00396
00397 pre_fichier("django6.txt","cadrebleu") ;
00398
00399 p("texte") ;
00400 echo " Ce qui ne fonctionne pas dans cette partie du tutoriel dans les salles " ;
00401 echo " du département informatique est la partie timezone. " ;
00402 echo " Il faut écrire ".b("import datetime")." pour pouvoir utiliser les ".em("timezone")."." ;
00403 finp() ;
00404
00405 finsolution() ; # contient un blockquote
00406
00407 finblockquote() ; # tp
00408
00409 ## -------------------------------------------------------------------------------------------
00410
00411 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Les vues (troisième partie)
00412
00413 ## -------------------------------------------------------------------------------------------
00414
00415 blockquote() ; # tp
00416
00417 blockquote() ; # énoncé
00418
00419 p("texte") ;
00420 echo " Suivre ce qui est indiqué dans la " ;
00421 echo href("https://docs.djangoproject.com/fr/2.1/intro/tutorial03/","troisième partie") ;
00422 echo " du tutoriel. " ;
00423 finp() ;
00424
00425 p("texte") ;
00426 echo " Après avoir ajouté les vues avec les textes en anglais, essayer de modifier ces vues " ;
00427 echo " pour que les textes soient en français." ;
00428 finp() ;
00429
00430 finblockquote() ; # énoncé
00431
00432 solutionTP($numExo,$numSerie) ; # contient un blockquote
00433
00434 p("texte") ;
00435 echo "Question volontairement non corrigée. Venez en T.P. !" ;
00436 finp() ;
00437
00438 finsolution() ; # contient un blockquote
00439
00440 finblockquote() ; # tp
00441
00442 ## -------------------------------------------------------------------------------------------
00443
00444 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Les formulaires (partie quatre)
00445
00446 ## -------------------------------------------------------------------------------------------
00447
00448 blockquote() ; # tp
00449
00450 blockquote() ; # énoncé
00451
00452 p("texte") ;
00453 echo " Suivre ce qui est indiqué dans la " ;
00454 echo href("https://docs.djangoproject.com/fr/2.1/intro/tutorial04/","quatrième partie") ;
00455 echo " du tutoriel. " ;
00456 finp() ;
00457
00458 p("texte") ;
00459 echo " Après avoir ajouté le code de la fonction ".b("vote()")." comme indiqué avec les textes en anglais, essayer de modifier ce code " ;
00460 echo " pour que le retour du ".b(em("render"))." soit en français." ;
00461 finp() ;
00462
00463
00464 p("texte") ;
00465 echo " Pouvez-vous aussi afficher en français le message d'erreur 404 ?" ;
00466 finp() ;
00467
00468 finblockquote() ; # énoncé
00469
00470 solutionTP($numExo,$numSerie) ; # contient un blockquote
00471
00472 p("texte") ;
00473 echo " Pour le message d'erreur 404 (page not found), le tutoriel fournit la réponse. " ;
00474 echo " Si ce n'est pas clair, consulter les lien suivants : " ;
00475 echo href("https://stackoverflow.com/questions/17662928/django-creating-a-custom-500-404-error-page","custom 404").", " ;
00476 echo href("https://wsvincent.com/django-local-404-page/","django-local-404-page")." ou en français " ;
00477 $url = "https://openclassrooms.com/fr/courses/1871271-developpez-votre-site-web-avec-le-framework-django/1871890-votre-premiere-page-grace-aux-vues" ;
00478 echo href($url,"page 404").". " ;
00479 finp() ;
00480
00481 finsolution() ; # contient un blockquote
00482
00483 finblockquote() ; # tp
00484
00485 ## -------------------------------------------------------------------------------------------
00486
00487 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Les tests (partie cinq) et la fin du tutoriel
00488
00489 ## -------------------------------------------------------------------------------------------
00490
00491 blockquote() ; # tp
00492
00493 blockquote() ; # énoncé
00494
00495 p("texte") ;
00496 echo " Vérifier que tout ce qui est écrit sur les tests dans la " ;
00497 echo href("https://docs.djangoproject.com/fr/2.1/intro/tutorial05/","partie cinq") ;
00498 echo " du tutoriel fonctionne comme indiqué. " ;
00499 finp() ;
00500
00501 p("texte") ;
00502 echo " Est-ce compliqué d'écrire des tests avec Django ?" ;
00503 finp() ;
00504
00505 p("texte") ;
00506 echo " Essayer d'ajouter un test pour garantir que dans l'ajout d'un utilisateur, le nom " ;
00507 echo " comporte au moins 3 caractères." ;
00508 finp() ;
00509
00510 p("texte") ;
00511 echo "Terminer le tutoriel en effectuant toutes les manipulations demandées." ;
00512 finp() ;
00513
00514 echo "" ;
00515
00516 finblockquote() ; # énoncé
00517
00518 solutionTP($numExo,$numSerie) ; # contient un blockquote
00519
00520 p("texte") ;
00521 echo " Les tests ne sont pas plus compliqués en Django que dans d'autres langages ou frameworks. " ;
00522 echo " Si les explications du tutoriel ne sont pas suffisantes, consulter, en anglais " ;
00523 echo href("https://wsvincent.com/django-testing-tutorial/","django-testing-tutorial") ;
00524 echo " ou, en français, " ;
00525 $url = "https://openclassrooms.com/fr/courses/1871271-developpez-votre-site-web-avec-le-framework-django/1874262-les-tests-unitaires" ;
00526 echo href($url,"tests unitaires en Django").". " ;
00527 finp() ;
00528
00529 finsolution() ; # contient un blockquote
00530
00531 finblockquote() ; # tp
00532
00533 ## -------------------------------------------------------------------------------------------
00534
00535 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # ne application plus complète entièrement en français
00536
00537 ## -------------------------------------------------------------------------------------------
00538
00539 blockquote() ; # tp
00540
00541 blockquote() ; # énoncé
00542
00543 p("texte") ;
00544 echo " Visiblement le tutoriel utilise des noms anglais partout, comme " ;
00545 echo ghBleu(" mysite")." au lieu de ".ghVert("monsite").", " ;
00546 echo ghBleu(" polls")." au lieu de ".ghVert("sondage").", " ;
00547 echo ghBleu(" Question text")." au lieu de ".ghVert("Texte de la question")."," ;
00548 echo ghBleu(" User")." au lieu d'".ghVert("utilisateur").", " ;
00549 echo ghBleu(" Date published")." au lieu de ".ghVert("Date de publication")."." ;
00550 echo " Recommencer tout le tutoriel dès le début en nommant tout en français, des noms de fichiers aux champs " ;
00551 echo " de la base de données. " ;
00552 finp() ;
00553
00554 p("texte") ;
00555 echo " Compléter le site du tutoriel initial avec la gestion de deux ".em("polls")." nommés sondage et questionnaire. " ;
00556 echo " Le premier ".em("poll")." consiste à demander à l'utilisateur s'il est fumeur, " ;
00557 echo " réponse obligatoire OUI ou NON. " ;
00558 echo " Le second ".em("poll")." demande à l'utilisateur sa taille en centimètres, son poids actuel en kilogrammes " ;
00559 echo " et le poids idéal qu'il/elle aimerait atteindre. " ;
00560 finp() ;
00561
00562 p("texte") ;
00563 echo b("En option, ") ;
00564 echo " fournir la liste des gens fumeurs et puis celle des non fumeurs dans un document PDF généré à la volée, " ;
00565 echo " afficher un histogramme des fréquences relatives des fumeurs et des non fumeurs (axes de 0 à 100 %) " ;
00566 echo " sous forme d'un graphique au format PNG, " ;
00567 echo " fournir une liste alphabétique des personnes ayant donné leur poids " ;
00568 echo " avec les informations taille, poids actuel, IMC actuel, poids idéal et IMC idéal " ;
00569 echo " ainsi qu'un graphique au format SVG qui fournit un box-plot des poids réels et actuels, " ;
00570 echo " un graphique au format PNG de l'histogramme de la distribution des poids réels..." ;
00571 finp() ;
00572
00573
00574 finblockquote() ; # énoncé
00575
00576 solutionTP($numExo,$numSerie) ; # contient un blockquote
00577
00578 p("texte") ;
00579 echo "L'ensemble des modifications au tuteur de base sont dans le fichier " ;
00580 echo href("tuteurComplet.zip").". Il s'agit en fait du code écrit par une étudiante " ;
00581 echo b("Alice BAZANTÉ")." qui nous a donné son accord pour qu'on puisse l'utiliser et que nous remercions officiellement. " ;
00582 echo " En principe, avec Danjo 2.1 ce site est totalement fonctionnel." ;
00583 finp() ;
00584
00585
00586 p("texte") ;
00587 echo "Une fois l'archive décompressée, après une migration via ".b("python manage.py migrate") ;
00588 echo " le site affiche, via ".b("python manage.py runserver") ;
00589 echo " pour l'URL ".href("http://127.0.0.1:8000/polls") ;
00590 finp() ;
00591
00592 p() ;
00593 nbsp(5) ;
00594 $img = "abp01.png" ;
00595 echo href($img,img($img,"",600)) ;
00596 finp() ;
00597
00598 p("texte") ;
00599 echo "Si on clique sur le questionnaire ".b("Quoi de neuf ?")." on voit " ;
00600 finp() ;
00601
00602 p() ;
00603 nbsp(5) ;
00604 $img = "abp02.png" ;
00605 echo href($img,img($img,"",600)) ;
00606 finp() ;
00607
00608 p("texte") ;
00609 echo " puis, une fois le vote validé " ;
00610 finp() ;
00611
00612 p() ;
00613 nbsp(5) ;
00614 $img = "abp03.png" ;
00615 echo href($img,img($img,"",600)) ;
00616 finp() ;
00617
00618 p("texte") ;
00619 echo " Voici le PDF généré :" ;
00620 finp() ;
00621
00622 p() ;
00623 nbsp(5) ;
00624 $img = "abp-pdf01.png" ;
00625 echo href($img,img($img,"",600)) ;
00626 finp() ;
00627
00628 p("texte") ;
00629 echo "Si on clique sur le questionnaire ".b("Etes-vous fumeur ?")." on voit " ;
00630 finp() ;
00631
00632 p() ;
00633 nbsp(5) ;
00634 $img = "abp04.png" ;
00635 echo href($img,img($img,"",600)) ;
00636 finp() ;
00637
00638 p("texte") ;
00639 echo " puis, une fois le vote validé " ;
00640 finp() ;
00641
00642 p() ;
00643 nbsp(5) ;
00644 $img = "abp05.png" ;
00645 echo href($img,img($img,"",600)) ;
00646 finp() ;
00647
00648 p("texte") ;
00649 echo " et le PDF généré est :" ;
00650 finp() ;
00651
00652 p() ;
00653 nbsp(5) ;
00654 $img = "abp-pdf02.png" ;
00655 echo href($img,img($img,"",600)) ;
00656 finp() ;
00657
00658
00659 p("texte") ;
00660 echo "Si on clique sur le questionnaire ".b("Etes-vous en forme ?")." on voit " ;
00661 finp() ;
00662
00663 p() ;
00664 nbsp(5) ;
00665 $img = "abp06.png" ;
00666 echo href($img,img($img,"",600)) ;
00667 finp() ;
00668
00669 p("texte") ;
00670 echo " puis, une fois le vote validé " ;
00671 finp() ;
00672
00673 p() ;
00674 nbsp(5) ;
00675 $img = "abp07.png" ;
00676 echo href($img,img($img,"",600)) ;
00677 finp() ;
00678
00679 p("texte") ;
00680 echo " Voici le PDF généré :" ;
00681 finp() ;
00682
00683 p() ;
00684 nbsp(5) ;
00685 $img = "abp-pdf03.png" ;
00686 echo href($img,img($img,"",600)) ;
00687 finp() ;
00688
00689 p("texte") ;
00690 echo " Nous vous laissons chercher, dans la petite centaine de fichiers présents dans ce projet, " ;
00691 echo " quels modules ont été utilisés pour les graphiques, la création du PDF, etc. Ce sera pour vous " ;
00692 echo " l'occasion de lire du $python et de comprendre l'architecture d'un projet au sens de ".ghBleu("Django").". " ;
00693 echo " Par exemple, dans la barre de menu noir, il y a marqué SONNAIRE au lieu de QUESTIONNAIRE, ce serait à changer... " ;
00694 echo " Vous pouvez aussi exécuter ".b("python manage.py createsuperuser")." pour avoir des droits d'administration afin de consulter tout le site. " ;
00695 finp() ;
00696
00697 p() ;
00698 nbsp(5) ;
00699 $img = "sonnaire.png" ;
00700 echo href($img,img($img,"",300)) ;
00701 finp() ;
00702
00703 p("texte") ;
00704 echo " Pour les courageuses et les courageux, le lien ".href("tuteurComplet_FR.zip") ;
00705 echo " fournit une solution tout en français -- ce qui ne consiste pas juste à renommer les répertoires -- comme ci-dessous :" ;
00706 finp() ;
00707
00708 p() ;
00709 nbsp(5) ;
00710 $img = "djangoTuteur_FR.png" ;
00711 echo href($img,img($img,"",600)) ;
00712 finp() ;
00713
00714 p("texte") ;
00715 echo " Au passage, l'URL ".b("http://127.0.0.1:8000")." renvoie aussi sur la bonne page..." ;
00716 finp() ;
00717
00718 finsolution() ; # contient un blockquote
00719
00720 finblockquote() ; # tp
00721
00722 #############################################################################
00723
00724 finTP($numSerie) ;
00725 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)