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 ---------------------------------