davin.baragiotta 31/08/2012 02:17:07
DÉBUT ATELIER DJANGO FRONTEND
1 Bonjour à tous 31/08/2012 02:17:11
2 https://wiki.auf.org/wikiteki/Projet/SemaineTech/2012/Ateliers/DjangoFrontend 31/08/2012 02:17:42
3 l'atelier Django Frontend est une suite logique de l'atelier Django Architecture d'un projet et backend 31/08/2012 02:18:03
4 mais peut être suivi indépendamment 31/08/2012 02:18:13
5 il est annoncé pour Django 1.4 et Django 1.1.1 31/08/2012 02:18:25
6 mais ce sera plus simple pour Django 1.1.1 car tout le matériel est prêt 31/08/2012 02:18:39
7 (1.4 devrit être prêt pour prochaine édition de cet atelier... plus tard en journée) 31/08/2012 02:18:58
8 la page de l,atelier.... le contenu de la présentation est ici : 31/08/2012 02:19:12
9 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support 31/08/2012 02:19:23
10 ach non! 31/08/2012 02:19:37
11 ici plutôt : 31/08/2012 02:19:42
12 https://wiki.auf.org/wikiteki/Ateliers/Django/Frontend/Support 31/08/2012 02:19:55
13 INTRODUCTION 31/08/2012 02:20:00
14 Notre objectif aujourd'hui 31/08/2012 02:20:11
15 est de présenter les données qu'on sait maintenant gérer dans l,admin 31/08/2012 02:20:23
16 les présentées au public dans des interfaces publiques 31/08/2012 02:20:32
17 la documentation Django est au même endroit qu'hier 31/08/2012 02:20:58
18 je sais que ceux qui suivent étaient là hier... 31/08/2012 02:21:11
19 maintenant, le contenu couvert ici équivaut au contenu de la 3e partie du tutoriel officiel 31/08/2012 02:21:36
20 je passe l'environnement technique... si il y a des nouveaux, vous manifester dans tech svp... Tri est modérateur 31/08/2012 02:22:00
21 RAPPELS ET AMORCE DU PROJET 31/08/2012 02:22:11
22 on veut pas repartir de zéro... 31/08/2012 02:22:19
23 c'est à dire qu'on veut pas 31/08/2012 02:22:29
24 recréer un projet, une app... faire toute la config... créer des modèles 31/08/2012 02:22:39
25 donc je vous ai donné des sources pour qu'on parte tous avec les mêmes bases 31/08/2012 02:23:01
26 Django 1.1.1 31/08/2012 02:23:04
27 https://wiki.auf.org/wikiteki/Ateliers/Django/Frontend/Support%3Faction%3DAttachFile%26do%3Dget%26target%3Dcarto_1_1_backend_final.tar.gz 31/08/2012 02:23:12
28 je vous laisse télécharger 31/08/2012 02:23:20
29 l'intérêt de cette archive 31/08/2012 02:23:28
30 c'est qu'elle correspondant au code complet final de l'atelier Backend 31/08/2012 02:23:50
31 on a même un jeu de données rigolo que j'ai saisi 31/08/2012 02:24:00
32 ah, pour ceux que ça intéresse 31/08/2012 02:24:07
33 l'ensemble des manips de l'atelier Backend et Frontend 31/08/2012 02:24:22
34 se trouve suivies dans git... 31/08/2012 02:24:28
35
36 Tri 31/08/2012 02:24:30
37 Cette page n'existe pas encore.!
38
39 davin.baragiotta 31/08/2012 02:24:33
40 dans mon dépôt perso
41 ok minute... je charge l'archive 31/08/2012 02:24:56
42 https://wiki.auf.org/wikiteki/Ateliers/Django/Frontend/Support?action=AttachFile&do=get&target=carto_1_1_backend_final.tar.gz 31/08/2012 02:25:41
43
44 Tri 31/08/2012 02:26:10
45 c'est bon!
46
47 davin.baragiotta 31/08/2012 02:26:34
48 super...
49 je vous laisse dépaqueter 31/08/2012 02:26:46
50 faire un petit :
51 python manage.py runserver 31/08/2012 02:27:03
52 regarde un coup dans l'admin pour voir les données : 31/08/2012 02:27:13
53
54 http://127.0.0.1:8000/admin 31/08/2012 02:27:26
55 questions? 31/08/2012 02:28:51
56 tout marche? 31/08/2012 02:28:54
57
58 Tri 31/08/2012 02:29:33
59 [09:28:44] Khone: Question: Les codes dans JP est pareil que hier (pour tous ce qui est fini) ?
60
61 davin.baragiotta 31/08/2012 02:29:56
62 JP ?
63 le code dans l,archive est pareil et plus que hier 31/08/2012 02:30:13
64 j'ai ajouté 2-3 trucs dans models.py et admin.py 31/08/2012 02:30:27
65 si vous avez votre code d'hier : pas de probl... 31/08/2012 02:30:36
66
67 Tri 31/08/2012 02:30:40
68 [09:30:38] Khone: Pièce-Joint (JP)
69
70 davin.baragiotta 31/08/2012 02:30:42
71 avez juste des données....
72 c'est nul de faire des listes d'un élément dans les interfaces 31/08/2012 02:31:03
73 ok.... je considère qu'on est tous ensemble dans le nouveau code de l,archive en Django 1.1.1 31/08/2012 02:31:36
74
75 Tri 31/08/2012 02:31:44
76 ca marche pour Huy et khuon
77
78 davin.baragiotta 31/08/2012 02:32:19
79 c'est important qu'on soit tous ok
80 tous : je présente dans la doc 3 options pour les sources : 31/08/2012 02:32:36
81 https://wiki.auf.org/wikiteki/Ateliers/Django/Frontend/Support#Amorce_du_projet 31/08/2012 02:32:41
82 télécharger l'archive est une approche 31/08/2012 02:32:52
83 ok on part pour vrai 31/08/2012 02:34:49
84 FRONTEND 31/08/2012 02:34:59
85 l'idée d'un frontend vs backend 31/08/2012 02:35:10
86 c'est un peu comme une boutique et son arrière boutique 31/08/2012 02:35:21
87 phouvichit.xongmixay a rejoint le salon 02:35
88
89 davin.baragiotta 31/08/2012 02:35:48
90 y'a des trucs qu'on veut pas offir au client : backend
91 le reste = frontend 31/08/2012 02:35:51
92 nous on code les interfaces publiques 31/08/2012 02:35:58
93 vous vous rappelez du schéma de dev web en Django? 31/08/2012 02:36:11
94 http://montrealpython.org/r/attachments/13/web-development.jpg 31/08/2012 02:36:20
95 là... on va passer dans tous les fichiers : 31/08/2012 02:36:32
96 dans cet ordre : 31/08/2012 02:36:36
97 urls.py 31/08/2012 02:36:37
98 views.py 31/08/2012 02:36:40
99 templates 31/08/2012 02:36:42
100 on va commecner par se créer une page d'accueil 31/08/2012 02:36:55
101 pas con, hein? 31/08/2012 02:36:58
102 la requête pour la page d,accueil = le root de notre nom de domaine 31/08/2012 02:37:18
103 / 31/08/2012 02:37:22
104 en localhost, ça donne : 31/08/2012 02:37:33
105 http://127.0.0.1:8000 31/08/2012 02:37:42
106 ou 31/08/2012 02:37:45
107 http://127.0.0.1:8000/ 31/08/2012 02:37:50
108 tapez cette URL dans notre navigateur 31/08/2012 02:38:05
109
110 python manage.py runserver doit rouler 31/08/2012 02:38:14
111 vous devez avoir une erreur 31/08/2012 02:38:38
112
113 shafeek.sumser 31/08/2012 02:38:44
114 oui
115 davin.baragiotta est en Django 1.4.... je suis pas des masses 02:38
116
117 davin.baragiotta 31/08/2012 02:38:58
118 normal
119 tran.xuan.huy a quitté la salle 02:39
120
121 davin.baragiotta 31/08/2012 02:39:16
122 ça doit dire que y,a pas d'URL pour ça
123 Tri a quitté la salle 02:39
124
125 davin.baragiotta 31/08/2012 02:39:50
126 donc on va coder l'urls qui gère le /
127 dans views.py 31/08/2012 02:39:54
128 non... dans urls.py 31/08/2012 02:40:07
129 éditer le fichier 31/08/2012 02:40:13
130 on va ajouter un ligne 31/08/2012 02:40:19
131 url(r'^$', 'carto_1_1.views.home', name='home'), 31/08/2012 02:40:29
132 Tri a rejoint le salon 02:40
133
134 davin.baragiotta 31/08/2012 02:41:03
135 carto_1_1 = facultatif... et s'appelle comme ça pour ceux ayant télécahrger les sources... c'est le nom du projet
136 ça se lit comme suit : 31/08/2012 02:41:07
137 Tri a quitté la salle 02:41
138 tran.xuan.huy a rejoint le salon 02:41
139
140 davin.baragiotta 31/08/2012 02:41:39
141 on édite le fichier suivant : carto_1_1/urls.py
142 Tri a rejoint le salon 02:41
143
144 davin.baragiotta 31/08/2012 02:41:49
145 pas dans l'app annuaire...
146 direct dans projet 31/08/2012 02:41:52
147 donc ça se lit comme suit : 31/08/2012 02:42:00
148 "voici un nouveau pattern d'URL : si après le nom de domain, ça commence avec (^) et finit ($) avec rien.... 31/08/2012 02:42:52
149 alors c'est la *fonction* dans carto_1_1.views.home qu'il faut exécuter 31/08/2012 02:43:17
150 et par ailleurs... le nom de ce pattern d'URL c'Est "home" 31/08/2012 02:43:30
151 voilà pour l'inteprétation de cette ligne 31/08/2012 02:43:38
152 maintenant... l'erreur devrait être différente au refresh 31/08/2012 02:43:49
153
154 shafeek.sumser 31/08/2012 02:43:55
155 oui
156
157 davin.baragiotta 31/08/2012 02:44:09
158 il doit dire "hey.... j'ai pas de views correspondant"
159 donc on va créer ce fichier views.py 31/08/2012 02:44:18
160 créez un fichier : carto_1_1/views.py 31/08/2012 02:44:32
161 PAS dans annuaire 31/08/2012 02:44:36
162 (fichier vide) 31/08/2012 02:44:47
163 petit mot sur génie logiciel... 31/08/2012 02:45:07
164 une app contient du code qui est logiquement peut dépendant du reste 31/08/2012 02:45:23
165 cohérence forte (dans l'app)... couplage faible (entre l'app et le reste) 31/08/2012 02:45:40
166 la page d'accueil... c'est la page du projet... 31/08/2012 02:45:49
167 pas de l'app... 31/08/2012 02:45:52
168 donc on la met ailleur que dans l'app 31/08/2012 02:45:59
169 donc on édite views.py : 31/08/2012 02:46:09
170
171 from django.shortcuts import render_to_response from django.template import Context, RequestContext def home(request): c = {} return render_to_response("home.html", Context(c), context_instance = RequestContext(request)) 31/08/2012 02:46:20
172 grrrrrrrrrr.... 31/08/2012 02:46:23
173 indenté 31/08/2012 02:46:28
174
175 # -*- encoding: utf-8 -*-
176
177 from django.shortcuts import render_to_response
178 from django.template import Context, RequestContext
179
180 from carto_1_1.annuaire.models import Etablissement
181
182 def home(request):
183 """Page d'accueil du site"""
184 c = {
185 }
186 return render_to_response("home.html", Context(c), context_instance = RequestContext(request)) 31/08/2012 02:46:43
187 copiez 31/08/2012 02:46:52
188 on en parle dans une seconde... 31/08/2012 02:46:57
189 ça c'est le code de base... qui se trouve dans la doc... 31/08/2012 02:47:20
190 c'est le bout pénible qu'on retient pas par coeur... 31/08/2012 02:47:29
191 et qu'on copie colle toujours 31/08/2012 02:47:34
192 aussi 31/08/2012 02:47:37
193
194 khone-cc 31/08/2012 02:47:38
195 Question de Khuon et Huy:
196 (09:45:23) khuon.tiv: Could not import carto_1_1.views. Error was: No module named views
197
198 davin.baragiotta 31/08/2012 02:47:55
199 khuon.tiv: justement... on crée ce views pour enelver l'erreur
200 n'oubliez pas : 31/08/2012 02:48:12
201 le but d'une app web c'est de construire une réponse à la requête HTTP 31/08/2012 02:48:32
202 là notre requête c'est GET / 31/08/2012 02:48:39
203 c,est pas seulement urls.py qui fait la réponse 31/08/2012 02:48:51
204 urls.py a les règles pour dispatcher le travail 31/08/2012 02:49:01
205 ça dit "ah? tu veux /... alors le boulot doit se faire là :" 31/08/2012 02:49:13
206 le là en question.... on a dit que c'était dans views.py sur la racine du projet... 31/08/2012 02:49:31
207
208 Tri 31/08/2012 02:49:33
209 Davin, je demande a Khone de faire la moderation, je dois regler un pb de courriel au BAP
210
211 davin.baragiotta 31/08/2012 02:49:40
212 ... mais il n'existe pas encore
213 Tri ok 31/08/2012 02:49:42
214 donc on crée views.py à la racine. 31/08/2012 02:49:55
215 relisons le code qu'on vient de copier dans views... qu'on comprenne ce qu'on fait 31/08/2012 02:50:10
216
217 # -*- encoding: utf-8 -*-
218
219 from django.shortcuts import render_to_response
220 from django.template import Context, RequestContext
221
222 from carto_1_1.annuaire.models import Etablissement
223
224 def home(request):
225 """Page d'accueil du site"""
226 c = {
227 }
228 return render_to_response("home.html", Context(c), context_instance = RequestContext(request)) 31/08/2012 02:50:13
229 les imports... (from... import) 31/08/2012 02:50:22
230 c'est toujours pour utiliser ce qu'on importe plus bas 31/08/2012 02:50:30
231 on import donc render_to_responses et Context et RequestContext 31/08/2012 02:50:46
232 c'est utilisé plus bas 31/08/2012 02:50:50
233 idem pour Etablissement... 31/08/2012 02:50:57
234 def home() 31/08/2012 02:51:01
235 Tri a quitté la salle 02:51
236
237 davin.baragiotta 31/08/2012 02:51:09
238 def = fonction en Python
239 tran.xuan.huy a quitté la salle 02:51
240
241 davin.baragiotta 31/08/2012 02:51:25
242 c'est la fonction qui a la responsabilité de créer la réponse à la requête HTTP
243 home() prend en paramètre... jsutement la requête :
244 request 31/08/2012 02:51:42
245 def home(request): 31/08/2012 02:51:50
246 Tri a rejoint le salon 02:52
247
248 davin.baragiotta 31/08/2012 02:52:18
249 une fonction peut retourner un résultat... ici, ce sera notre réponse Http
250 return ... 31/08/2012 02:52:25
251 Tri a quitté la salle 02:52
252
253 davin.baragiotta 31/08/2012 02:53:07
254 render_to_response... son boulot et justement de faire le rendu d'un template (HTML)... pour construire la réponse finale à la requête
255 Tri a rejoint le salon 02:53
256 tran.xuan.huy a rejoint le salon 02:53
257
258 davin.baragiotta 31/08/2012 02:53:34
259 si on regarde les param de render_to_response()
260 "home.html"... c'est le template HTML qu'on veut "rendre".... c'est à dire interpréter et résoudre pour faire un rendu sous forme de réponse 31/08/2012 02:54:11
261 ritesh.dhora a rejoint le salon 02:54
262
263 davin.baragiotta 31/08/2012 02:54:34
264 Context et le RequestContext... c'est des variables qui sont passées au template
265 on y revient 31/08/2012 02:54:42
266 bon! 31/08/2012 02:54:44
267 alors on a donc codé views.py : avec la focntion appelée par urls.py 31/08/2012 02:54:58
268 faites refresh... vous devriez avoir une dernière erreur 31/08/2012 02:55:10
269 des questions sur urls.py et views.py? 31/08/2012 02:55:19
270
271 khone-cc 31/08/2012 02:56:17
272 (09:56:50) Khone: Question: Dans le param de render_to_response(), on peut réponse plusieurs pages par home.html, contact.html ...?
273
274 davin.baragiotta 31/08/2012 02:56:23
275 non
276
277 khone-cc 31/08/2012 02:56:38
278 pas autre question, continue ..
279
280 davin.baragiotta 31/08/2012 02:56:38
281 ça n'a pas de sens : on fait une réponse à une requête
282 si tu veux "switcher"... soit du le fait dans l'urls.py (bonne approhce) 31/08/2012 02:56:54
283 ou tu switche plus haut dans la focntion.... 31/08/2012 02:57:03
284 mais chaque render_to_response() = 1 seul template 31/08/2012 02:57:13
285 maintenant votre erreur devrait plus être "hey on n'a pas de views" 31/08/2012 02:57:28
286 mais plutôt "hey, on n'a pas le template home.html!" 31/08/2012 02:57:40
287 donc on va le créer 31/08/2012 02:57:47
288 par convention 31/08/2012 02:57:57
289 dans les projets django 31/08/2012 02:58:01
290 on met les templates dans un répertoire nommé... 31/08/2012 02:58:10
291 templates! 31/08/2012 02:58:13
292 créez un répertoire templates à la racine du projet 31/08/2012 02:58:25
293 dans ce répertoire... créez home.html 31/08/2012 02:58:50
294 mettez quelque chose de sympa dans home.html 31/08/2012 02:59:18
295 genre :
296 <h1>J'aime Django</h1> 31/08/2012 02:59:35
297 en principe, un refresh devrait rendre le tout ok 31/08/2012 02:59:51
298 mais en principe seulement 31/08/2012 02:59:59
299 faut configurer Django pour qu'il sache où sont les templates 31/08/2012 03:00:11
300 lui dire la convention qu'on suit quoi! 31/08/2012 03:00:18
301 ouvrez settings.py 31/08/2012 03:00:32
302 onveut éditer TEMPLATE_DIRS 31/08/2012 03:00:43
303 lisez un peu le message en commentaire... 31/08/2012 03:00:51
304
305 khone-cc 31/08/2012 03:01:03
306 Question: (10:01:29) shafeek.sumser: faut modifier le settings.py pour activer le templates?
307
308 davin.baragiotta 31/08/2012 03:01:23
309 oui
310 essaie refresh sans avoir modifé settings.py 31/08/2012 03:01:33
311 toujours erreur, non? 31/08/2012 03:01:41
312
313 khone-cc 31/08/2012 03:01:56
314 Oui; tjs erreur ..
315
316 davin.baragiotta 31/08/2012 03:01:59
317
318 bon l'idée... c'est que Django sache le path exact pour aller chercher les templates... 31/08/2012 03:02:21
319 bosco.boukone a rejoint le salon 03:02
320
321 davin.baragiotta 31/08/2012 03:02:39
322 absolute paths
323 comment faire pour coder sans qu'on ait à modifer la config quand on déploiera sur serveur??? 31/08/2012 03:02:59
324 là on travaille dans notre home/user/... 31/08/2012 03:03:08
325 (ou ailleurs) 31/08/2012 03:03:12
326 mais on sait pas où code sera déployé sur serveur 31/08/2012 03:03:21
327 bref 31/08/2012 03:03:22
328 faut chemin absolu qu,on va construire dynamiquement : 31/08/2012 03:03:40
329
330 shafeek.sumser 31/08/2012 03:03:44
331 template_dirs à modifier aussi ?
332
333 davin.baragiotta 31/08/2012 03:04:12
334 TEMPLATE_DIRS est à modifier... la seule config qu'on a tenté de modifié aujourd'hui
335 (hier on a fait des modifs à settings) 31/08/2012 03:04:22
336 donc 31/08/2012 03:04:25
337 ajoutez :
338 import os 31/08/2012 03:04:30
339 Tri a quitté la salle 03:04
340
341 davin.baragiotta 31/08/2012 03:04:33
342 en haut de fihier
343 os = un module de standard library 31/08/2012 03:04:47
344 permet de manipuler le système de fichier 31/08/2012 03:04:54
345 ajouté ceci dans template dir : 31/08/2012 03:05:02
346 Tri a rejoint le salon 03:05
347
348 davin.baragiotta 31/08/2012 03:05:07
349 os.path.join(os.path.dirname(__file__), "templates"),
350 ça donne ceci au final : 31/08/2012 03:05:13
351 TEMPLATE_DIRS = (
352 # Put strings here, like "/home/html/django_templates" or "Cwww/django/templates".
353 # Always use forward slashes, even on Windows.
354 # Don't forget to use absolute paths, not relative paths.
355 os.path.join(os.path.dirname(__file__), "templates"),
356 ) 31/08/2012 03:05:19
357 lisons.... 31/08/2012 03:05:22
358 __file__ = le fichier en cours... donc settings.py 31/08/2012 03:05:39
359 on dit donc "prend le répertoire parent de settings.py ey join le à "templates") 31/08/2012 03:06:07
360
361 khone-cc 31/08/2012 03:06:17
362 Question: (10:06:34) nguyen.le.duc.huy: Q: import os dans setting.py?
363
364 davin.baragiotta 31/08/2012 03:06:32
365 pas le répertoire... en fait c'est le path absolu sur le système
366 oui dans settings 31/08/2012 03:06:35
367 ça se résouds comme suit : /home/user/projets/carto_1_1/ 31/08/2012 03:07:00
368 pour moi 31/08/2012 03:07:03
369 c'est la façon de créer dynamiquement un path absolu vers un fichier... relativement à settings.py 31/08/2012 03:07:32
370 bref... si vous comprendez pas : pas grave, ça marche 31/08/2012 03:07:43
371
372 nguyen.le.duc.huy 31/08/2012 03:07:54
373 ls
374
375 davin.baragiotta 31/08/2012 03:07:59
376 ?
377 maintenant, ne faisant un refresh... 31/08/2012 03:08:08
378 vous devriez voir votre code HTML dans le navigateur ; 31/08/2012 03:08:25
379 plus d'erreur.... 31/08/2012 03:08:28
380 exact? 31/08/2012 03:08:39
381 ben bravo! vous avez une application web qui répond à une requête HTTP par une réponse HTTP : retourne du HTML 31/08/2012 03:09:45
382 31/08/2012 03:09:46
383 mmais bon... 31/08/2012 03:09:58
384 c'est pas très sexy comme traitement 31/08/2012 03:10:09
385 je vais vous montrer un peu l'intérêt d'un views.py 31/08/2012 03:10:21
386 on veut pas traiter juste des fihciers statiques... comme on vient de le faire avec notre home.html 31/08/2012 03:10:39
387 on veut du dynamique 31/08/2012 03:10:43
388 une page qui va afficher des variables 31/08/2012 03:10:55
389 31/08/2012 03:10:59
390 dans views.py 31/08/2012 03:11:05
391 focntion home 31/08/2012 03:11:08
392 on va "passer" une variable au template 31/08/2012 03:11:17
393 codez : dans le corps de la fcontion : 31/08/2012 03:11:57
394
395 def home(request):
396 """Page d'accueil du site"""
397 variable = "Davin"
398 c = {
399 'var':variable,
400 }
401 return render_to_response("home.html", Context(c), context_instance = RequestContext(request)) 31/08/2012 03:12:39
402 lisons 31/08/2012 03:12:46
403 variable = 'Davin' 31/08/2012 03:12:52
404 c'est un string Python 31/08/2012 03:12:57
405 pas très dynamique car "hardcodé" dans la fonction 31/08/2012 03:13:10
406 codé en dur... 31/08/2012 03:13:13
407 (ensuite on va interroger la DB... on y arrive ) 31/08/2012 03:13:24
408 c = dictionnaire Python 31/08/2012 03:13:36
409 avec { } 31/08/2012 03:13:41
410 'var' = une des clés du dictionnaires (la seule déclarée) 31/08/2012 03:13:58
411 on voit que cette clé prend la valeur de variable 31/08/2012 03:14:11
412 'var':variable, 31/08/2012 03:14:17
413 finalement... 31/08/2012 03:14:22
414 le dictionnaire "c" est passé à Context 31/08/2012 03:14:39
415 qui a pour but de rendre accessible toutes les clés du dictionnaire 31/08/2012 03:14:56
416 comme des "variables" pour le template 31/08/2012 03:15:06
417 en clair : 'var' devient donc accessible dans le template 31/08/2012 03:15:17
418 faisons la preuve 31/08/2012 03:15:20
419 ouvrons le template 31/08/2012 03:15:23
420 édition : templates/home.html 31/08/2012 03:15:38
421 ajoutez un peu n'importe où "{{ var }}" 31/08/2012 03:15:57
422 la syntaxe dans un template... ce n'est plus du Python 31/08/2012 03:16:09
423 c'est un langage de template 31/08/2012 03:16:15
424 Django a son propre langage de template 31/08/2012 03:16:22
425 mais il existe des lanages indépendants dans l'univers Python, comme "mako" 31/08/2012 03:16:41
426 bref : Django est monolithique... il a ses propres trucs... et tout est documenté sur son site : pratique 31/08/2012 03:17:02
427 revenons à nos moutons 31/08/2012 03:17:08
428 donc le langage de template de Django nous permet d'afficher la valeur d'une variable passée au template : 31/08/2012 03:17:31
429 la syntexe c'est 31/08/2012 03:17:35
430 {{ nom_variable }} 31/08/2012 03:17:44
431 le nom de la variable, c'est la clé du dictionnaire... 31/08/2012 03:17:57
432 donc ici c'est {{ var }} 31/08/2012 03:18:05
433 refresh : vous devriez voir le string codé dans la fonction 31/08/2012 03:18:17
434 dans mon exemple : 'Davin' 31/08/2012 03:18:24
435 ça marche? 31/08/2012 03:18:27
436 des questions? 31/08/2012 03:18:30
437 on a un pépin avec un participant, on débogue dans tech 31/08/2012 03:22:30
438 thierry.tsitoara a quitté la salle 03:28
439
440 davin.baragiotta 31/08/2012 03:29:57
441 hourra!
442 tout est réglé! 31/08/2012 03:30:00
443 on avait édité des fichiers sans les sauvegarder... et aussi 31/08/2012 03:30:12
444 on avait fait une erreur dans la clé du dictionnaire (nom de variable) 31/08/2012 03:30:34
445 bon 31/08/2012 03:30:35
446 maintenant passons aux choses sérieuses 31/08/2012 03:30:42
447 car afficher du code "hardcodé"... codé en dur... c'est nul 31/08/2012 03:30:56
448 on va interrogé la base de donnéess 31/08/2012 03:31:03
449 attachez-vous... là on va sérieusement devenir des développeurs d'applications web 31/08/2012 03:31:23
450 plan de match : 31/08/2012 03:31:31
451 https://wiki.auf.org/wikiteki/Ateliers/Django/Frontend/Support 31/08/2012 03:31:38
452 ORM : exploration interactive 31/08/2012 03:31:55
453 vous avez suivi l'atelier Python.... 31/08/2012 03:32:10
454 vous avez une idée de la puissance du langage et des imports qui viennent 31/08/2012 03:32:25
455 qui viennent avec 31/08/2012 03:32:38
456 dans Django 31/08/2012 03:32:49
457 le vrai code Python vit dans les views.py 31/08/2012 03:33:08
458 c'est à dire que le reste, c'est plutôt de la config 31/08/2012 03:33:19
459 bien sûr que urls.py c'est du Python 31/08/2012 03:33:27
460 mais on suit les convention de Django pour configurer nos patterns 31/08/2012 03:33:40
461 dans les views.py 31/08/2012 03:33:45
462 dans ses focntions on fait ce qu'on veut 31/08/2012 03:33:52
463 une page... son contenu... ça se construit comme on veut 31/08/2012 03:34:01
464 et cette consturction c'est dans views.py 31/08/2012 03:34:10
465 le rôle de views.py 31/08/2012 03:34:13
466 c'est de fournir les variables au template 31/08/2012 03:34:25
467 donc faire tout le traitement logique sur les données et "parler" à l'utilisateur dans le template 31/08/2012 03:34:44
468 notre projet... c,est celui d'un annuaire de l'AUF 31/08/2012 03:35:01
469 il est temps de coder autre chose que des hello world 31/08/2012 03:35:11
470 31/08/2012 03:35:12
471 on veut, dans nos views, appeler les données de la base de données 31/08/2012 03:35:33
472 les stocker dans des variables 31/08/2012 03:35:40
473 et les passer au template 31/08/2012 03:35:44
474 donc 31/08/2012 03:35:45
475 tout ceci se fait avec l'ORM de Django 31/08/2012 03:35:54
476 (il existe en Python d'autres ORM... comme SQLAlchemy, plus puissant d'ailleurs... mais on aime Django car il est monolithique) 31/08/2012 03:36:23
477 Django a son ORM 31/08/2012 03:36:30
478 la doc d'utilisation de l'ORM est ici : 31/08/2012 03:36:39
479 olivier.larcheveque a rejoint le salon 03:36
480
481 davin.baragiotta 31/08/2012 03:36:47
482 https://docs.djangoproject.com/en/1.4//topics/db/queries/
483 maintenant 31/08/2012 03:36:52
484 on va vu que la meilleure façon d'expérimenter en Python 31/08/2012 03:37:10
485 c'est dans l'interpréteur 31/08/2012 03:37:17
486 on va donc expérimenter l'ORM dans l'interpréteur 31/08/2012 03:37:32
487 pour lancer l'interpréteur avec tout l'environnement de Django 31/08/2012 03:37:48
488 (settings, par exemple) 31/08/2012 03:37:55
489 faut faire la commande suivante : 31/08/2012 03:38:02
490
491 python manage.py shell 31/08/2012 03:38:11
492 demandez à Django de lancez le shell dans le contexte de notre projet 31/08/2012 03:38:33
493
494 khone-cc 31/08/2012 03:38:37
495 (10:39:09) Khone: Question: est-ce qu'on peut utiliser: ipython manage.py shell ?
496
497 davin.baragiotta 31/08/2012 03:38:42
498 non
499 python = pour exécuter manage.py 31/08/2012 03:38:58
500 ensuite... manage.py exécute la commande shell 31/08/2012 03:39:09
501 et dans ce cas... il utilise ton shell préféré 31/08/2012 03:39:19
502 si tu as iPython d'installé 31/08/2012 03:39:26
503 c'est lui qui doit être lancé par : 31/08/2012 03:39:34
504
505 python manage.py shell 31/08/2012 03:39:40
506 exact? 31/08/2012 03:39:44
507
508 khone-cc 31/08/2012 03:39:48
509 ok
510
511 davin.baragiotta 31/08/2012 03:39:59
512 ok
513 super 31/08/2012 03:40:06
514 nous allons donc utilisez l'ORM 31/08/2012 03:40:15
515 dernier mot de théorie : 31/08/2012 03:40:21
516 ORM = object relational mapping 31/08/2012 03:40:29
517 c'est à dire 31/08/2012 03:40:31
518 association entre la notion d'objet et la notion de base de données relationnelle 31/08/2012 03:40:49
519 la DB relational = carto.db 31/08/2012 03:40:57
520 la notion d'objet = models.py 31/08/2012 03:41:04
521 olivier.larcheveque a quitté la salle 03:41
522
523 davin.baragiotta 31/08/2012 03:41:29
524 Django offre un lien automaitque... qui va nous permettre de faire en Python des requêtes sur la DB
525 sans faire de SQL 31/08/2012 03:41:34
526 c'est tout l'idée derrière l'ORM 31/08/2012 03:41:41
527 utilisons-le 31/08/2012 03:41:47
528 from annuaire.models import * 31/08/2012 03:41:59
529 on importe dans le shell tous les modèles codés dans annuaire.models(.py) 31/08/2012 03:42:18
530 l'ORM existe sur nos classes déclarées dans models.py 31/08/2012 03:42:41
531 car on les a fait héritées de models.Model.... c'est lui, l'ORM! 31/08/2012 03:42:55
532 le modèle suprême! 31/08/2012 03:43:08
533 ok 31/08/2012 03:43:09
534 pour accéder aux objets (rows) de notre classe Etablissement... on a ce qu'on techniquement on appelle un manager : 31/08/2012 03:43:41
535 object 31/08/2012 03:43:43
536 Etablissement.objects 31/08/2012 03:43:50
537 c'est lui qui manage l'accès à la DB, disons.... 31/08/2012 03:44:01
538 on a ensuite des méthodes sur objects... qui font en Python ce qu,on veut faire en SQL : 31/08/2012 03:44:28
539 .all() = sélectionne tous les rows sans condition 31/08/2012 03:44:41
540 pas de WHERE SQL 31/08/2012 03:44:46
541 essayez : 31/08/2012 03:44:53
542 etablissements = Etablissement.objects.all() 31/08/2012 03:45:06
543 (on stocke les rows dans variable etablissements) 31/08/2012 03:45:16
544 ça marche? 31/08/2012 03:45:25
545 on peut introspecter, comme dans l,atelier Python! 31/08/2012 03:45:36
546 type(etablissements) 31/08/2012 03:45:42
547 on voit que c'est un QuerySet 31/08/2012 03:45:52
548 darasy.nong a quitté la salle 03:46
549
550 davin.baragiotta 31/08/2012 03:46:08
551 sous-entendu... un ensemble d'objets provenant d'une requête
552
553 khone-cc 31/08/2012 03:46:15
554 Oui..
555
556 davin.baragiotta 31/08/2012 03:46:18
557 travaillons maintenant avec les données de la DB
558 etablissements... c'est un conteneur de vos rows... sous forme d'objet Python!!!! 31/08/2012 03:46:43
559 (oubliez les fetch results!!!) 31/08/2012 03:46:52
560 maintenat, on sait qu'on peut itérer sur les conteneurs (comme les listes) 31/08/2012 03:47:11
561 en faisant un for! 31/08/2012 03:47:15
562 allez-y! 31/08/2012 03:47:18
563
564 for e in etablissement: print e 31/08/2012 03:47:27
565 31/08/2012 03:47:28
566 au pluriel, désolé 31/08/2012 03:47:36
567 for e in etablissements : print e 31/08/2012 03:47:46
568 ahaha 31/08/2012 03:47:47
569 ça affiche une représentation (__unicode__) des Etablissements! 31/08/2012 03:48:05
570 comme dans l,admin, en fait! 31/08/2012 03:48:13
571 bon... on va prendre qu'un établissement 31/08/2012 03:48:21
572 en utilisant les index : 31/08/2012 03:48:26
573 e = etablissements[0] 31/08/2012 03:48:35
574 ça marche? 31/08/2012 03:48:38
575
576 khone-cc 31/08/2012 03:48:46
577 moi, ouip
578
579 davin.baragiotta 31/08/2012 03:48:49
580 des questions jusqu'à maintenant sur l'ORM?
581 on continue 31/08/2012 03:49:08
582 e = un seul objet... c'est plus un itérable 31/08/2012 03:49:18
583
584 khone-cc 31/08/2012 03:49:35
585 (10:50:09) Khone: e = etablissements[0] rien afficher?
586
587 davin.baragiotta 31/08/2012 03:49:38
588 on peut afficher son nom ou sigle... tous les champs déclarés dans models.py!
589 non, c,est une assignation 31/08/2012 03:49:47
590
591 khone-cc 31/08/2012 03:49:54
592 (c le suivant qui affiche)
593
594 davin.baragiotta 31/08/2012 03:50:09
595 on assigne dans la variable e l'indez 0 de etablissements
596 juste e 31/08/2012 03:50:17
597 ou print e 31/08/2012 03:50:19
598 affiche le unicode de ce seul objet 31/08/2012 03:50:25
599 e.nom 31/08/2012 03:50:28
600 e.sigle 31/08/2012 03:50:30
601 c'est magnifique, non? 31/08/2012 03:50:37
602 bien sûr, pareil avec les personnes!!!! 31/08/2012 03:50:49
603 je vais vous montrer comment appeler un seul résultat (pas plusieurs) 31/08/2012 03:51:14
604 .get() 31/08/2012 03:51:16
605 Personne.objects.get(id=1) 31/08/2012 03:51:29
606 p = Personne.objects.get(id=1) 31/08/2012 03:51:38
607
608 khone-cc 31/08/2012 03:51:43
609 Question tran.xuan.huy:
610 (10:49:54) tran.xuan.huy: je veux voir les sigle
611 (10:49:58) tran.xuan.huy: comment on va faire
612
613 davin.baragiotta 31/08/2012 03:51:45
614 (stockons le dans p, pour le manipuler
615 e.sigle 31/08/2012 03:51:51
616 possible que e n'ait pas de data pour sigle... c,est un champs facultatifs 31/08/2012 03:52:10
617 tu veux voir tous les sigles de la DB? 31/08/2012 03:52:16
618 for e in etablissements: print e.sigle 31/08/2012 03:52:23
619 (la ligne print pourrait être en-dessous + indentée... obligé si plusieurs lignes de traitement) 31/08/2012 03:52:54
620 ok pour sigle? 31/08/2012 03:52:58
621
622 khone-cc 31/08/2012 03:53:00
623 (10:53:09) tran.xuan.huy: non, c'est ok pour moi
624
625 davin.baragiotta 31/08/2012 03:53:03
626 p = qui?
627 print p 31/08/2012 03:53:11
628 Davin? 31/08/2012 03:53:15
629 si oui... je sais que dans les datas (je les ai saisies) il a une date de naissance : 31/08/2012 03:53:30
630 p.date_naissance 31/08/2012 03:53:34
631 je veux vous montrer 2 autres trucs de l'ORM 31/08/2012 03:53:58
632 filter() 31/08/2012 03:54:03
633 pour faire un WHERE 31/08/2012 03:54:09
634 personnes = Personne.objects.filter(nom='Baragiotta') 31/08/2012 03:54:30
635 sort toutes les personnes avec ce nom compliqué 31/08/2012 03:54:38
636 (pas juste un) 31/08/2012 03:54:50
637 on peut même généralisé la recherche 31/08/2012 03:55:05
638 avec des commandes qu'on trouve dans le lien de la doc fourni plus haut : 31/08/2012 03:55:16
639 personnes = Personne.objects.filter(nom__startswith='Bara') 31/08/2012 03:55:30
640 explicite... 31/08/2012 03:55:35
641 la magie est dans le double underscore : __startswith 31/08/2012 03:55:46
642 aussi, finalement... 31/08/2012 03:55:54
643 tran.xuan.huy a quitté la salle 03:56
644 Tri a quitté la salle 03:56
645
646 davin.baragiotta 31/08/2012 03:56:17
647 le filter peut se faire sur un champ associé par une ForeignKey
648 personnes = Personne.objects.filter(etablissement__nom__contains='Montréal') 31/08/2012 03:56:26
649 toutes les personnes qui ont ét.... 31/08/2012 03:56:36
650 ach 31/08/2012 03:56:37
651 dans le code c'est université 31/08/2012 03:56:42
652 : 31/08/2012 03:56:44
653 personnes = Personne.objects.filter(universite__nom__contains='Montréal') 31/08/2012 03:56:53
654 voilà 31/08/2012 03:56:56
655 toutes les personnes qui ont une université dont le nom contient "Montréal" 31/08/2012 03:57:16
656 31/08/2012 03:57:18
657 ça marche pour tous? 31/08/2012 03:57:27
658
659 khone-cc 31/08/2012 03:57:29
660
661
662 davin.baragiotta 31/08/2012 03:57:45
663 oubliez les reques complexes en SQL!
664 *requêtes 31/08/2012 03:57:52
665 tran.xuan.huy a rejoint le salon 03:57
666 Tri a rejoint le salon 03:58
667
668 davin.baragiotta 31/08/2012 03:58:16
669 ok, pendant que je fais une pause santé... voici un exercice :
670 le code que vous avez préféré, dans le shell... en explorant : 31/08/2012 03:58:31
671 copiez-le dans la fonction home() 31/08/2012 03:58:41
672 stockez l'infos que vous aimez dans les variables 31/08/2012 03:59:08
673 et passez les au template (à travers c = {} ) 31/08/2012 03:59:24
674 il faut au minimum la variable : 31/08/2012 03:59:40
675 etablissements = Etablissement.objects.all() 31/08/2012 03:59:45
676 svp 31/08/2012 03:59:47
677 (de retour dans 2 minutes) 31/08/2012 03:59:53
678 de retour 31/08/2012 04:02:07
679 davin.baragiotta a quitté la salle 04:08
680 davin.baragiotta a rejoint le salon 04:09
681
682 davin.baragiotta 31/08/2012 04:10:48
683 bon retombons sur nos pieds
684 on faisait quoi? 31/08/2012 04:10:52
685 on explorait, dans le shell... l'utilisation de l'ORM pour appeler la DB en Python (pas en SQL) 31/08/2012 04:11:14
686 pour créer des variables dans home() 31/08/2012 04:11:25
687 donc 31/08/2012 04:11:29
688 on va maintenant coder le fruit de nos investigations : 31/08/2012 04:11:42
689 ajoutez dans home : 31/08/2012 04:12:27
690
691 etablissements = Etablissement.objects.all()
692 c = {
693 'etablissements': etablissements,
694 } 31/08/2012 04:12:42
695 ensuite, dans le template 31/08/2012 04:12:54
696 au lieu de faire {{ etablissements }} 31/08/2012 04:13:04
697 je vais vous montrer à boucler avec le langage de templating de Django 31/08/2012 04:13:19
698 ouvrez home.html 31/08/2012 04:13:27
699 il existe des "tags" 31/08/2012 04:13:36
700 qu'on peut utiliser dasn les templates 31/08/2012 04:13:43
701 voici la doc : 31/08/2012 04:13:48
702 https://docs.djangoproject.com/en/1.1/ 31/08/2012 04:14:13
703 1.1 31/08/2012 04:14:16
704 dans le centre y,a "Templage layer" 31/08/2012 04:14:27
705 template, désolé 31/08/2012 04:14:34
706 built-in tags and filters : 31/08/2012 04:14:48
707 https://docs.djangoproject.com/en/1.1/ref/templates/builtins/#ref-templates-builtins 31/08/2012 04:14:48
708 filters = un peu comme filtres SPIP 31/08/2012 04:14:59
709 tag = plus puissant 31/08/2012 04:15:06
710 tag for 31/08/2012 04:15:12
711 https://docs.djangoproject.com/en/1.1/ref/templates/builtins/#for 31/08/2012 04:15:22
712 {% for e in etablissements %} 31/08/2012 04:15:35
713 ça ressemble beaucoup à Python 31/08/2012 04:15:44
714 mais c'en est pas 31/08/2012 04:15:48
715 faut finir tout tag 31/08/2012 04:15:58
716 avec son endtag 31/08/2012 04:16:02
717 {% endfor %} 31/08/2012 04:16:08
718 codez ceci dans votre template, pour le plaisir : 31/08/2012 04:16:20
719
720 khone-cc 31/08/2012 04:17:31
721 <h2>Classe Etablisement</h2>
722 {% for e in etablissements %}
723 <li>{{ e }}</li>
724 {% endfor %}
725 tran.xuan.huy a quitté la salle 04:17
726
727 davin.baragiotta 31/08/2012 04:17:39
728 ahaha oui!
729 Tri a quitté la salle 04:17
730
731 davin.baragiotta 31/08/2012 04:17:53
732 (je fatigue! )
733
734 <h2>Classe Etablisement</h2>
735 {% for e in etablissements %}
736 <li>{{ e }}</li>
737 {% endfor %} 31/08/2012 04:18:02
738 mieux 31/08/2012 04:18:07
739 ajoutez <ul> et </ul> 31/08/2012 04:18:21
740 avant et après for 31/08/2012 04:18:25
741 pour faire du vrai HTML 31/08/2012 04:18:30
742
743 khone-cc 31/08/2012 04:18:35
744 ok
745
746 davin.baragiotta 31/08/2012 04:18:44
747 ok, vous voyez la liste des établissements?
748 maintenant... malheureusement l,atelier tire à sa fin 31/08/2012 04:19:21
749 on est déja`en retard 31/08/2012 04:19:28
750 mais moi j'ai un peu de temps 31/08/2012 04:19:33
751
752 khone-cc 31/08/2012 04:19:37
753 moi, ça à l'aire bien affiché ..
754 tran.xuan.huy a rejoint le salon 04:19
755
756 davin.baragiotta 31/08/2012 04:19:42
757 au mois pour conclure
758 Tri a rejoint le salon 04:19
759
760 davin.baragiotta 31/08/2012 04:19:59
761 revenons au plan :
762 ORM : utilisation réelle 31/08/2012 04:20:11
763 on est rendu dans l'utilisation réelle de l'ORM 31/08/2012 04:20:20
764 c'est fait 31/08/2012 04:20:22
765 rendez-vous compte des possibilités : 31/08/2012 04:20:31
766 vous appelez les données de la base de données comme vous voulez, pour créer une page HTML 31/08/2012 04:20:51
767 ça pourrait être du RSS 31/08/2012 04:20:58
768 appeller la DB pour lister dans un template respectant syntaxe RSS les nouvelles 31/08/2012 04:21:18
769 (mais y,a des outils qui font ça automatiquement) 31/08/2012 04:21:26
770 je voulais vous faire coder d'autres trucs 31/08/2012 04:21:40
771 mais tout est toujours trop long 31/08/2012 04:21:46
772 je vous propose donc de vous téléporter 31/08/2012 04:21:53
773 dans le temps 31/08/2012 04:21:55
774 en téléchargeant les sources finales de l'atelier 31/08/2012 04:22:03
775 avec plein truc dont je peux parler en démo 31/08/2012 04:22:13
776 (fini le code pour vous) 31/08/2012 04:22:18
777 ça vous va? 31/08/2012 04:22:21
778 https://wiki.auf.org/wikiteki/Ateliers/Django/Frontend/Support?action=AttachFile&do=get&target=carto_1_1_final.tar.gz 31/08/2012 04:22:41
779 sources finales 31/08/2012 04:22:48
780 décompresser + aller dans répertoire 31/08/2012 04:23:05
781 + python manage.py runserver 31/08/2012 04:23:12
782 tout le monde y est? 31/08/2012 04:24:19
783 Tri a quitté la salle 04:28
784 tran.xuan.huy a quitté la salle 04:28
785 Tri a rejoint le salon 04:30
786 Tri a quitté la salle 04:30
787 Tri a rejoint le salon 04:31
788 tran.xuan.huy a rejoint le salon 04:31
789
790 davin.baragiotta 31/08/2012 04:33:08
791 messieurs... l'heure est grave....
792 c'est la finale en feu d'artifice 31/08/2012 04:33:18
793 vous avez téléchargé les sources finales 31/08/2012 04:33:28
794 vous avez décompressé le .tar.gz 31/08/2012 04:33:40
795 vous êtes dans le répertoire du projet décompressé 31/08/2012 04:33:54
796 vous allumez le feu :
797 python manage.py runserver 31/08/2012 04:34:04
798 et allez sur : 31/08/2012 04:34:08
799 http://127.0.0.1:8000 31/08/2012 04:34:18
800 tadaaaaaaaaaaaaaaaaaaaaaaaaaam!!!!!! 31/08/2012 04:34:23
801 vous devriez avoir un super site avec des styles 31/08/2012 04:35:08
802 entre autres 31/08/2012 04:35:12
803 ça marche? (mais cachez votre joie!) 31/08/2012 04:35:23
804 tran.xuan.huy a quitté la salle 04:35
805 Tri a quitté la salle 04:35
806
807 davin.baragiotta 31/08/2012 04:36:55
808 bon je termine en vous montrant ce qui a été fait... que vous n'avez pas fait :
809 https://wiki.auf.org/wikiteki/Ateliers/Django/Frontend/Support 31/08/2012 04:37:04
810 héritage de template 31/08/2012 04:37:09
811 regardez bien... y,a un base.html 31/08/2012 04:37:17
812 qui déclare des {% block ... 31/08/2012 04:37:26
813 et toutes les autres pages 31/08/2012 04:37:33
814 {% extends "base.html" 31/08/2012 04:37:43
815 de sorte que tout le vrai code HTML qu'on veut pas coder dans chaque page 31/08/2012 04:37:57
816 est dans base.html 31/08/2012 04:38:01
817 et les autres pages remplissent les block 31/08/2012 04:38:10
818 autre chose 31/08/2012 04:38:14
819 les URLs avec paramètres 31/08/2012 04:38:24
820 ouvres annuaire/urls.py 31/08/2012 04:38:32
821 voyez la syntaxe particulière pour capter l'id 31/08/2012 04:38:43
822 ouvrez annuaire/views.py 31/08/2012 04:38:56
823 regardez le id passé à la fonction... qui nous permet de faire un .get() dans l'ORM... comme on a fait dans le shell 31/08/2012 04:39:25
824 avec ça : on fait une page de détail... pour CET établissement ou CETTE personne 31/08/2012 04:39:43
825 le plus impressionnant, c'est le style 31/08/2012 04:40:03
826 mais c'est rien d'autre que du CSS 31/08/2012 04:40:11
827 dans répertoire /media/ 31/08/2012 04:40:19
828 correctemetn configuré dans settings.py 31/08/2012 04:40:27
829 et utilisé dans base.html : {{ MEDIA_URL }} 31/08/2012 04:40:41
830 finalement... 31/08/2012 04:40:55
831 la connexion du user 31/08/2012 04:40:59
832 que je vous laisse expérimenter dans les interfaces 31/08/2012 04:41:11
833 et étudier sur : urls.py, connexion.html, deconnexion.html 31/08/2012 04:41:26
834 shafeek.sumser a quitté la salle 04:41
835
836 davin.baragiotta 31/08/2012 04:41:35
837 voilà, c'est tout?
838 (24 minutes de dépassé) 31/08/2012 04:41:53
839 des questions? 31/08/2012 04:41:55
840
841 nguyen.le.duc.huy 31/08/2012 04:42:46
842 ls
843
844 davin.baragiotta 31/08/2012 04:42:54
845 si pas de question... je conclue
846 ls = ? 31/08/2012 04:42:58
847
848 nguyen.le.duc.huy 31/08/2012 04:42:58
849 Pardon trompe la fenentre
850
851 davin.baragiotta 31/08/2012 04:43:02
852 ah!
853
854 khone-cc 31/08/2012 04:43:32
855 (11:43:37) khuon.tiv: Combien de web codes ont dans cet interface ? Python-Django CSS HTML quoi d'autre ?
856
857 davin.baragiotta 31/08/2012 04:44:38
858 web codes? pas sûr de comprendre... mais les technos impliqués :
859 oui : python, django (framework Python), Apache éventuellement, HTTP, CSS, HTML, JS au besoin 31/08/2012 04:45:04
860 voir le schéma : 31/08/2012 04:45:07
861 http://montrealpython.org/r/attachments/13/web-development.jpg 31/08/2012 04:45:15
862 shafeek.sumser a rejoint le salon 04:45
863
864 davin.baragiotta 31/08/2012 04:45:25
865 autres questions?
866
867 khone-cc 31/08/2012 04:45:40
868 Non
869 yeap, GRAND MERCI PROF PYTHON-DJANGO... 31/08/2012 04:45:43
870
871 davin.baragiotta 31/08/2012 04:45:59
872
873
874 khone-cc 31/08/2012 04:46:01
875 on lui laisse à Dodo...
876
877 davin.baragiotta 31/08/2012 04:46:05
878 je conclue donc rapido :
879 vous avex une bombe entre les mains : 31/08/2012 04:46:13
880 la puissance de Python sur le web 31/08/2012 04:46:19
881 tout ce que vous êtes capables de faire avec des import de Python... 31/08/2012 04:46:37
882 ... vous pouvez l'utiliser sur le web avec les views... 31/08/2012 04:46:49
883 et stocker vos data dans une DB 31/08/2012 04:46:57
884 (là c'était sqlite... mais on peut mettre MySQL évidemment, ou autre) 31/08/2012 04:47:20
885 tous nos projets SI de l'AUF = Django 31/08/2012 04:47:32
886 y,a du Python partant dans git.auf.org! 31/08/2012 04:47:41
887 je vous laisse apprécier la montée en puissance que vous venez de faire 31/08/2012 04:47:57
888 et surtout 31/08/2012 04:47:58
889 on est tous ensemble, tout le temps... la communauté tech : 31/08/2012 04:48:10
890 on vit dans le salon tech, ari-si ou autres 31/08/2012 04:48:18
891
892 shafeek.sumser 31/08/2012 04:48:29
893 davin une dernière question: est-ce qu'avec django on peut faire du ajax et jquery?
894
895 davin.baragiotta 31/08/2012 04:48:30
896 n'hésitez à poser les questions et...
897 ... on n'est pas obligés d,attendre la prochaine semaine Tech pour continuer d'apprendre et collaborer 31/08/2012 04:48:55
898 réponse : 31/08/2012 04:48:59
899 oui, Ajax = rien d'autre qu'un appel de JS sur serveur... 31/08/2012 04:49:15
900 un appel partiel, en quelque sorte car veut pas une page complète 31/08/2012 04:49:36
901 donc 31/08/2012 04:49:37
902 on met le code JQuery qu'on veut dans notre template HTML 31/08/2012 04:49:52
903 dans une balise link qui lie vers un script : dans /media/js ( {{ MEDIA_URL }}/js/le_script_qui_tue.js 31/08/2012 04:50:35
904 ensuite 31/08/2012 04:50:41
905 ce script appelle une URL 31/08/2012 04:50:47
906 gérée dans urls.py 31/08/2012 04:50:51
907 qui appelle une fonction dans views.py 31/08/2012 04:51:01
908 qui retourne un FRAGMENT HTML 31/08/2012 04:51:10
909 même principe qu'on vient de voir 31/08/2012 04:51:18
910 sauf un appel partiel pour raffraichir un fragmenr de code 31/08/2012 04:51:30
911 le JS dans jQuery qui reçoit la réponse partielle... 31/08/2012 04:51:47
912 ... va ajouter ce fragment dans le DOM en cours 31/08/2012 04:51:57
913
914 shafeek.sumser 31/08/2012 04:52:00
915 ok j'étais pas présent, viens d'arriver au bureau je rattraperai ce soir
916
917 davin.baragiotta 31/08/2012 04:52:03
918 voilà
919 ok à ce soir (ce matin pour moi... en fait ) 31/08/2012 04:52:18
FIN ATELIER DJANGO FRONTEND
31/08/2012 04:52:35