Projet / SemaineTech / 2012 / Ateliers / DjangoFrontedArchive

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

Projet/SemaineTech/2012/Ateliers/DjangoFrontedArchive (dernière édition le 2013-02-25 08:29:34 par ArnaudAmelina)