1 (15:10:38) davin.baragiotta: -------------------- DEBUT : Atelier Django --------------------
   2 (15:10:50) olivier.larcheveque: Bonjour!
   3 (15:11:34) olivier.larcheveque: cet atelier va présenter Django, un framework qui permet de construite des applications Web
   4 (15:12:38) olivier.larcheveque: il va notemment montrer comment on peut créer rapidement des interfaces web qui permettent de manipuler une base de données
   5 (15:12:52) olivier.larcheveque: normalement vous disposez d'un projet fonctionnel
   6 (15:12:56) olivier.larcheveque: taper 
   7 (15:13:03) olivier.larcheveque: bin/django runserver
   8 (15:13:41) olivier.larcheveque: on voit ceci dans le terminal
   9 (15:13:43) olivier.larcheveque: 
  10 Development server is running at http://127.0.0.1:8000/
  11 Quit the server with CONTROL-C.
  12 
  13 
  14 (15:14:15) olivier.larcheveque: le serveur Web est donc prêt à recevoir des requêtes par votre navigateur
  15 (15:14:40) olivier.larcheveque: aller a cette adresse
  16 (15:14:41) olivier.larcheveque: 
  17 http://127.0.0.1:8000/media/ppp/presentation.html
  18 (15:15:45) olivier.larcheveque: correct jusqu'ici?
  19 (15:15:45) davin.baragiotta: a priori oui : pas de commentaires
  20 (15:16:00) olivier.larcheveque: diapp plan, 1 point un peu de théorie
  21 (15:16:54) olivier.larcheveque: puis les points 2 et 3 ou nous allons construire une application avec des interfaces web qui permettent de manipuler une des données provenant de la base
  22 (15:18:00) olivier.larcheveque: Tout ceci va permettre de construire une application Django capable de fournir des fonctionnalités de base pour un site de support (FAQ + téléchargement de fichiers ressources)
  23 (15:18:31) olivier.larcheveque: diapo framework
  24 (15:18:48) olivier.larcheveque: un framework, c'est tout simplement une boite à outils de code
  25 (15:20:09) olivier.larcheveque: il apporte des briques logicielles de base, qui permettent de développer pas mal tout ce qu'on veut sans avoir à tout recoder
  26 (15:20:25) olivier.larcheveque: diapo suivante
  27 (15:20:55) olivier.larcheveque: un framework vient avec des notions de bases
  28 (15:21:07) olivier.larcheveque: des bonnes pratiques disons
  29 (15:21:17) olivier.larcheveque: expliquées dans cette diapo
  30 (15:21:46) olivier.larcheveque: c'est le cas de Django, il suit cette séparation logique dans son code, et le code que vous allez faire
  31 (15:21:57) olivier.larcheveque: diapo traitement d'une requete
  32 (15:22:26) olivier.larcheveque: on va examiner ce qui se passe pour voir une page web
  33 (15:23:08) olivier.larcheveque: ouvrez un autre onglet navigateur et aller ici 
  34 (15:23:09) olivier.larcheveque: 
  35 http://127.0.0.1:8000/support/faq/
  36 (15:23:31) olivier.larcheveque: ouvrez parallalement un editeur de fichier
  37 (15:24:09) olivier.larcheveque: le serveur recoit une requete et la transmet a Django
  38 (15:24:23) olivier.larcheveque: il doit la router
  39 (15:24:50) olivier.larcheveque: c'est déclaré dans le fichier project/support/urls.py
  40 (15:25:28) olivier.larcheveque: on a appelé la page faq tantot, ce qui route vers la vue "faq"
  41 (15:25:58) olivier.larcheveque: ensuite regardons le fichier project/support/views.py
  42 (15:26:51) olivier.larcheveque: il y a la fonction faq() qui est responsable de construire la page, et fournir une réponse HTTP, en utilisant un template HTML
  43 (15:27:11) olivier.larcheveque: on retrouve les templates dans project/support/templates
  44 (15:27:29) olivier.larcheveque: c'est bon?
  45 (15:27:44) davin.baragiotta: pas de questions à date
  46 (15:28:02) olivier.larcheveque: ok on va passer direct dans l'admin ici
  47 (15:28:05) olivier.larcheveque: 
  48 http://127.0.0.1:8000/admin/
  49 (15:28:22) olivier.larcheveque: vous avez besoin du login/mdp lors de l'installation du projet
  50 (15:28:43) olivier.larcheveque: on voit dans l'application support FAQ
  51 (15:29:00) olivier.larcheveque: si on clique on peut aller sur une page qui liste les FAQ
  52 (15:29:20) olivier.larcheveque: on peut en ajouter une nouvelle si on veut avec le bouton en haut à droite
  53 (15:29:49) olivier.larcheveque: nous allons créer la meme choses pour qu'on puisse ajouter des Ressources
  54 (15:30:22) olivier.larcheveque: allons dans le fichier project/support/models.py
  55 (15:30:32) olivier.larcheveque: il y a un modèle à créer
  56 (15:30:53) olivier.larcheveque: vous pouvez vous inspirer du modèle FAQ pour créer le votre
  57 (15:31:47) olivier.larcheveque: une fois votre modèle ajusté
  58 (15:31:49) olivier.larcheveque: faites
  59 (15:32:04) olivier.larcheveque: bin/django reset support (YES sans crainte)
  60 (15:32:21) davin.baragiotta: 
  61 si vous voulez voir la FAQ que vous venez d'ajouter dans l'interface admin : assurez-vous d'avoir coché le champ "public"... ensuite, vous pouvez recharger la page public (hors admin) : http://127.0.0.1:8000/support/faq/
  62 (15:32:42) olivier.larcheveque: ceci a pour effet de créer les tables en BD
  63 (15:33:15) olivier.larcheveque: (les chanceux avec un projet cablé sur MySQL avec un phpMyAdmin peuvent voir ca tout de suite)
  64 (15:33:51) olivier.larcheveque: voici une proposition de modèle ci :
  65 (15:33:53) olivier.larcheveque: 
  66 http://paste.pocoo.org/show/464971/
  67 (15:34:36) olivier.larcheveque: 1. mettons cette classe dans le support/models.py
  68 (15:34:53) olivier.larcheveque: 2. bin/django reset support pour créer la structure en BD
  69 (15:35:37) olivier.larcheveque: bon, génial on a un modele on va intergarir dessus en greffant les interfaces d'admin
  70 (15:35:53) olivier.larcheveque: dans le fichier project/support/admin.py
  71 (15:36:40) olivier.larcheveque: il faut enregister son modele de données une une classe admin qui permet de créer les interfaces automatiquement
  72 (15:37:20) olivier.larcheveque: on voit pas mal de choses pour notre modele FAQ
  73 (15:37:35) olivier.larcheveque: on va faire de meme pour notre modele Ressource
  74 (15:37:43) olivier.larcheveque: encore plus minimaliste!
  75 (15:38:22) olivier.larcheveque: voici une possibilité a ajouter a la fin de project/support/admin.py
  76 (15:38:26) olivier.larcheveque: 
  77 http://paste.pocoo.org/show/464974/
  78 (15:39:12) davin.baragiotta: ( vous pouvez mettre 4 espaces devant "pass" pour être PEP8 ;) )
  79 (15:39:19) olivier.larcheveque: finalement on peut retourner voir dans l'admin
  80 (15:39:27) olivier.larcheveque: 
  81 http://127.0.0.1:8000/admin/
  82 (15:39:54) olivier.larcheveque: Normalement, le modèle Ressources apparait dans l'application "support"
  83 (15:40:48) olivier.larcheveque: Si c'est le cas, cliquez dessus pour aller a la page de liste
  84 (15:41:04) olivier.larcheveque: puis ajouter une ressource (lien en haut a droite)
  85 (15:41:49) davin.baragiotta: attention : notre modèle rend obligatoire les 2 champs ;)
  86 (15:41:58) olivier.larcheveque: on constate que les champs, sont rendus automiquement avec les bons widgets (titre = widget input test, fichier = widget upload de fichier)
  87 (15:43:31) olivier.larcheveque: C'est pas génial quand même?
  88 (15:43:44) davin.baragiotta: plutôt!
  89 (15:43:56) olivier.larcheveque: ca va pour vous?
  90 (15:44:52) davin.baragiotta: tout marche on dirait bien!
  91 (15:44:57) davin.baragiotta: les gens sont en feu! ;)
  92 (15:45:00) olivier.larcheveque: moi je continue pas sans réponse, j'ai le temps dans mon atelier, c'est un atelier Django on fait les trucs tellement vite!
  93 (15:45:31) olivier.larcheveque: ok bon on voit dans la liste des objets ressources
  94 (15:45:31) davin.baragiotta: réponse : ça roule!, continuons!
  95 (15:45:35) olivier.larcheveque: 
  96 http://127.0.0.1:8000/admin/support/ressource/
  97 (15:46:01) olivier.larcheveque: une ligne "ressource object" qui correspond à ce qu'on vient d'ajouter
  98 (15:46:24) olivier.larcheveque: on va arranger ca pour afficher le titre de la ressource qu'on a rempli
  99 (15:46:38) olivier.larcheveque: retourner dans le fichier support/admin.py
 100 (15:48:08) olivier.larcheveque: et on ajoute une variable dans la classe nommée list_display
 101 (15:48:18) olivier.larcheveque: qui est une liste
 102 (15:48:27) olivier.larcheveque: ou on spécifie le champs à afficher
 103 (15:48:32) olivier.larcheveque: ce qui donne : 
 104 (15:48:34) olivier.larcheveque: 
 105 http://paste.pocoo.org/show/466464/
 106 (15:48:47) olivier.larcheveque: (ligne 3)
 107 (15:49:05) olivier.larcheveque: retourner voir le changement 
 108 (15:49:06) olivier.larcheveque: 
 109 http://127.0.0.1:8000/admin/support/ressource/
 110 (15:51:16) olivier.larcheveque: Tout ceci permet d'avoir un beau petit backend
 111 (15:52:05) olivier.larcheveque: Le framework Django permet ensuite d'exploiter nos données pour les proposer dans un portail, comme je vous ai montré au départ
 112 (15:53:11) olivier.larcheveque: Il propose des modules intéressants comme l'ORM qui permet de manipuler la BD à travers des objets Python
 113 (15:53:55) olivier.larcheveque: ou encore des modules qui permettent de générer des formulaires automatiquement en se reposant sur un modèle de données particulier
 114 (15:54:05) olivier.larcheveque: (comme dans l'admin!)
 115 (15:55:12) olivier.larcheveque: Des questions?
 116 (15:55:49) davin.baragiotta: 
 117 (10:51:04) davin.baragiotta: QUESTION : pourquoi je ne vois pas ma ressource s'afficher dans la partie publique du site?
 118 (10:51:23) davin.baragiotta: http://127.0.0.1:8000/support/docs/
 119 (10:54:29) olivier.larcheveque: Parce qu'on ne l'a pas codé ;)
 120 (15:56:27) olivier.larcheveque: ok bon je pense qu'on peut essayer de faire la vue
 121 (15:56:43) olivier.larcheveque: on s'attaque au fichier support/views.py
 122 (15:57:04) olivier.larcheveque: la fonction docs est deja prete!
 123 (15:57:14) olivier.larcheveque: avec un TODO!
 124 (15:57:43) olivier.larcheveque: il s'agit de récupérer les Ressources et les ajouter au dictionnaire data
 125 (15:57:56) olivier.larcheveque: regarder la fonction faq() pour vous inspirer
 126 (15:58:26) olivier.larcheveque: en haut on a un from models import FAQ
 127 (15:58:38) olivier.larcheveque: importons aussi notre model Ressource
 128 (15:58:43) davin.baragiotta: on va donc coder pour quoi voit la liste des ressources dans site public (frontend)?
 129 (15:58:51) olivier.larcheveque: from models import FAQ, Ressource
 130 (15:59:17) olivier.larcheveque: oui on est parti pour faire une vue qui liste les ressources dans le site public!
 131 (16:00:11) davin.baragiotta: hourra!
 132 (16:00:25) olivier.larcheveque: 
 133 def docs(request):
 134     """
 135     Page qui liste les ressources.
 136     """
 137     data = {
 138       'ressources' : Ressource.objects.all(),
 139     }
 140     return render_to_response('support/docs.html', data, RequestContext(request))
 141 (16:01:03) olivier.larcheveque: voyez la manière de récupérer l'ensemble des  ressources
 142 (16:01:13) olivier.larcheveque: Ressource.objects.all()
 143 (16:02:12) davin.baragiotta: en une ligne seulement? ouah!
 144 (16:02:16) olivier.larcheveque: rendons-nous maintenant dans la template pour faire afficher ces ressources
 145 (16:02:40) olivier.larcheveque: project/support/templates/support/docs.html
 146 (16:03:35) olivier.larcheveque: on va itérer sur les objets ressources préparés dans la view
 147 (16:04:26) olivier.larcheveque: coller cette petite portion apres le titre
 148 (16:04:34) olivier.larcheveque: 
 149 {% for res in ressources %}
 150   <p>{{ res.titre }}</p>
 151 {% endfor %}
 152 (16:05:24) olivier.larcheveque: ce langage dans la template est un langage spécial (minimaliste)
 153 (16:05:29) olivier.larcheveque: une boucle for
 154 (16:05:49) olivier.larcheveque: {{ }} pour afficher la valeur d'un objet 
 155 (16:06:15) olivier.larcheveque: 
 156 si il n'y a pas d'erreurs, on retourne http://127.0.0.1:8000/support/docs/
 157 (16:06:37) olivier.larcheveque: et on devrait voir le titre des ressources s'affichier
 158 (16:06:58) olivier.larcheveque: (on peut imaginer ajouter le lien pour télécharger le fichier)
 159 (16:07:22) olivier.larcheveque: Et voilà ca fait 1H ;)
 160 (16:07:23) davin.baragiotta: 
 161 QUESTION : (11:07:07) thierry.tsitoara: QUESTION: Apres import FAQ, Ressource on fait quoi deja . Je sais pas si je suis perdu :-)
 162 (16:07:44) davin.baragiotta: 
 163 thierry : faut coder le corps de la focntion
 164 (16:07:52) davin.baragiotta: 
 165 
 166 def docs(request):
 167     """
 168     Page qui liste les ressources.
 169     """
 170     data = {
 171       'ressources' : Ressource.objects.all(),
 172     }
 173     return render_to_response('support/docs.html', data, RequestContext(request))
 174 (16:07:59) davin.baragiotta: en fait cette fonction existait déjà
 175 (16:08:03) davin.baragiotta: manquait que la ligne :
 176 (16:08:10) davin.baragiotta: 'ressources' : Ressource.objects.all(),
 177 (16:08:20) davin.baragiotta: dans la variable (dictionnaire) "data"
 178 (16:08:54) davin.baragiotta: la views prépare les variables qu'on utilisera dans template (notre gabarit HTML)
 179 (16:09:34) davin.baragiotta: dans la variables nommées "ressources" on dit à Django d'aller chercher tous les objets de notre classe Ressource
 180 (16:09:55) davin.baragiotta: (Django va chercher l'info dans notre base de données)
 181 (16:10:31) davin.baragiotta: donc, après, faut coder le template pour utiliser la variable "ressources"
 182 (16:10:51) davin.baragiotta: on l'utilise en itération (avec "for") sur tous les objets récupérer de la base de données
 183 (16:12:00) olivier.larcheveque: Je vais commiter les solutions de l'Atelier dans une branche solutions
 184 (16:12:16) davin.baragiotta: 
 185 QUESTION :
 186 (11:11:42) willy.manga: QUESTION : en suivant un peu le tuto officiel, on propose plusieurs façons d'obtenir des vues. as-tu une préférence ? là tu as utiliser render_to_response de django.shortcuts pourquoi ?
 187 (16:13:29) olivier.larcheveque: la plupart du temps, ton but c'est de mapper des données dans un template (HTML)
 188 (16:14:49) olivier.larcheveque: En gros ca t'évite d'instancier uen classe Template, de le render avec les données, s'instancier une réponse HTTP et de fournir ton template renderé...
 189 (16:15:19) davin.baragiotta: donc render_to_response nous convient dans la plupart des cas, pour les autres cas, voir la doc?
 190 (16:15:56) davin.baragiotta: 
 191 (11:13:36) progfou: REMARQUE : quand la page à afficher ne réclame pas de traitement complexe, on peut aussi réutiliser les vues génériques de Django : https://docs.djangoproject.com/en/1.2/ref/generic-views/#simple-generic-views
 192 (16:16:03) davin.baragiotta: 
 193 (11:15:18) thierry.tsitoara: QUESTION: Le templates que tu es en train de parler, est ce les fichiers html dans /support/templates/support ?
 194 (16:16:31) olivier.larcheveque: exact thierry
 195 (16:16:38) davin.baragiotta: oui les templates vivent dans /templates
 196 (16:16:47) olivier.larcheveque: celle de notre exemple c'est docs.html
 197 (16:17:07) davin.baragiotta: c'est cette ligne qui donne le nom du template :
 198 (16:17:08) davin.baragiotta:     return render_to_response('support/docs.html', data, RequestContext(request))
 199 (16:18:09) davin.baragiotta: en gros ça se lit : construit moi la réponse HTTP à partir de ce template suppoert/docs.html pour lequel je te fournit les variables dans data (en plus du contexte)
 200 (16:21:16) olivier.larcheveque: Je viens de vous mettre les exemples que vous avez ajoutés dans le code, dans une branche solutions ;)
 201 (16:23:07) davin.baragiotta: --------------------------------- FIN : Atelier Django ---------------------------------