=== ARCHIVE ATELIER DJANGO/BAKEND === {{{#!highlight irc arnaud.amelina@auf.org 12:33:24 ================================= Debut ATELIER Django : backend ==================================== jimmy.baroki a quitté le salon 12:35:36 davin.baragiotta 12:36:10 Bonjour à tous, Encore une fois cette année... Django 12:36:19 Le matériel de présentation est celui de l'an passé : 12:36:33 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support 12:36:49 mais 12:37:00 comme on avait des difficultés avec les différentes versions de Django 12:37:16 (1.1.1 dispo sur Ubuntu 10.04) 12:37:24 on a une procédure pour 12:37:34 ENVIRONNEMENT TECHNIQUE 12:37:38 https://wiki.auf.org/wikiteki/Projet/SemaineTech/2013/Ateliers/DjangoBackend 12:37:57 on va se créer un environnement virtuel avec la version des paquets Python qu'il nous faut 12:38:29 quoi? vous n,avez pas suivi l,atelier virtualenv? 12:38:39 malheureux! 12:38:43 mais bonne nouvelle : vous pourrez participer à cet atelier 12:38:55 (mais vous ne comprendrez peut-être pas les premières étapes) 12:39:10 vous devriez maintenant avoir plusieurs fenêtres ouvertes : 12:39:22 * celle-ci 12:39:25 * la page web de présentation : on va la suivre en détail, c'est un atelier pratique ici 12:39:43 * un terminal ouvert 12:39:49 dans le terminal 12:39:54 suivez les étapes pour l'environnement technique 12:40:05 sudo apt-get install virtualenv 12:40:29 si vous ne l,aviez pas déjà 12:40:37 créer un répertoire pour les ateliers Django : mkdir 12:41:00 (faites ça dans votre home) 12:41:06 ~$ mkdir django 12:41:17 allez y 12:41:21 cd django 12:41:24 maintenant on crée un environnement virtuel pour avoir les versions qu'on veut *en local* 12:41:49 on va pouvoir travailler avec Django 1.4.6, dispo dans Wheezy... même si on est sur une Ubuntu 10.04 12:42:10 (qui lui offre Django 1.1.1) 12:42:21 ~$ virtualenv atelier 12:42:32 activons l'environnement virtuel 12:42:42 ~$ source atelier/bin/activate 12:42:54 maintenant, le prompt montre qu'on est dans le contexte de l,environnement virtuel de l'atelier : (atelier)~$ 12:43:29 ritesh.dhora a quitté le salon 12:43:53 davin.baragiotta 12:43:54 installer Django et South, avec les versions dispo dans Wheezy : (atelier)~$ pip install Django==1.4.6 (atelier)~$ pip install south==0.7.6 12:44:19 Django 7.7 Mb 12:45:37 jimmy.baroki a rejoint le salon 12:46:29 davin.baragiotta 12:46:34 South 91kb O.o ok 12:46:38 maintenant... toujours dans notre environnement 12:46:46 on va lancer notre interpréteur 12:46:58 interpréteur Python 12:47:15 moi j'utilise ipython 12:47:24 (atelier)~$ ipython 12:47:31 dans l'interpréteur... importez Django (hey, on code en Python là!) 12:47:50 import django 12:47:54 bon ça marche pas avec mon ipython 12:48:42 donc 12:48:43 utilisez python 12:48:48 (atelier)~$ python 12:48:56 (désolé) 12:49:05 >>> import django 12:49:16 il ne devrait pas y avoir d'erreur 12:49:25 toujours dans interpréteur... tester la version de Django 12:49:42 >>> django.get_version() 12:49:54 si vous n'avez pas '1.4.6'.... on arrête tout! 12:50:25 tout le monde a bien 1.4.6? 12:50:37 ok, si c'est juste moi et progfou qui suivent, je retourne me coucher ;) 12:52:27 brice.ondjibou a rejoint le salon 12:52:39 claudine.mosozi a quitté le salon 12:53:00 claudine.mosozi a rejoint le salon 12:53:14 progfou 12:53:19 à mon avis il faut attendre un peu le chargement des 7,7 Mio chez les autres… mine de rien ça peut prendre plusieurs minutes sur des liaisons bien occupées… kazuhiro.oguchi 12:55:02 question un peu hors sujet, sur ipython il trouve pas le module django mais dans python oui. une conf a faire quelques pars ? davin.baragiotta 12:55:41 kazuhiro.oguchi: en fait... quand j'ai lancé ipython... il utilisait le ipython de mon système... et de mon système... il ne voyait pas ce que j'avais installé dans mon environnement local 12:56:11 voilà 12:56:14 python, lui... est installé lors de la création du venv 12:56:36 preuve : atelier/bin/ 12:56:45 progfou: ok on attend 12:57:14 progfou 12:57:58 une erreur pendant l'installation pour Claudine davin.baragiotta 12:58:37 ok, j'attends... encore un peu à ce point-ci, vous devriez avoir Django 1.4.6 13:00:19 pour le reste des commandes, je ne vais pas écrire le venv devant le prompt... mais assurez-vous d'avoir (atelier)~$ 13:00:53 INTRODUCTION 13:00:56 https://wiki.auf.org/wikiteki/Ateliers/Django/Backend/Support 13:01:14 Nous sommes maintenant entré dans l'univers du développement d'application web (avec Python) 13:01:51 Django est un framework qui nous permet d'aller plus vite... et de ne pas réinventer la roue 13:02:16 les problèmes récurrents ont déja`leur solution dans Django 13:02:38 d'abord... la documentation 13:02:49 Django est très bien documenté. 13:03:01 car ça fait parti du projet : un release doit avoir la doc à jour 13:03:16 quand vous allez sur le site de django et que vous cliquez sur doc.... assurez-vous de choisir la bonne version en bas à droite 13:03:42 donc 1.4 pour nous 13:03:47 https://docs.djangoproject.com/en/1.4/ 13:03:59 aussi, il y a un tutoriel 13:04:27 accessible en haut de la doc 13:04:32 les 2 ateliers Django de la Semaine Tech couvrent ce tutoriel (presqu'en totalité, avec exemple AUFien) 13:05:02 pour finir l'intro : 13:05:25 c'est important de coder notre projet dans une version de Django disponible sur nos serveurs 13:05:43 notre objectif aujourd'hui : 13:06:07 * comprendre l,architecture d'un projet django (quoi fait quoi) 13:06:18 * gérer des données dans l'admin de django 13:06:27 PARTIE 1 : DÉVELOPPEMENT WEB AVEC DJANGO : ARCHITECTURE D'UN PROJET 13:06:29 http://montrealpython.org/r/attachments/13/web-development.jpg 13:06:47 petit schéma sympa 13:06:55 pour savoir où on se trouve quand on fait du développement web 13:07:11 nous, on code en Python pour une app côté serveur... qui va répondre à une requête HTTP... en envoyant une réponse HTTP avant pour contenu (généralement) du HTML 13:07:54 voilà tout 13:07:58 actuellement, dans cet atelier 13:08:24 on va coder en local... l'environnement de développement est sur notre machine 13:08:52 DEV 13:08:56 Django offre un serveur local quand on est en mode de développement 13:09:11 il existe d'autres framework de développement web Python, notamment Pyramid, mais je passe sur les détails 13:09:41 (on en parle après si vous voulez) 13:09:50 un avantage de Django = tout-en-un et son interface admin qu'on va expérimenter dans quelques instants 13:10:16 Les principaux fichiers impliqués sont représentés sur le schéma... mais on les verra en détail, un par un 13:10:54 on est sur le point maintenant de créer notre projet Django 13:11:08 tout le monde suit? 13:11:11 dj6mplo a rejoint le salon 13:12:14 yemen.sayour a quitté le salon 13:12:17 mclaude a rejoint le salon 13:16:05 davin.baragiotta 13:17:00 bon jusqu'à maintenant... on n'a rien fait du point de vu Django donnons-nous un projet... 13:17:17 lisez dans le doc de présentation 13:17:26 PARTIE 2 : PROJET ET APPLICATIONS 13:17:40 L'AUF vous dit "hey, on veut cartographier nos membres" 13:18:01 vous dites "quoi? qu'est-ce à dire?" 13:18:18 on vous explique qu'on veut savoir quels professeurs sont dans quels établissements... 13:18:47 quels formations sont données par les établissements 13:18:55 quels sont les labos, etc. 13:19:02 donc vous vous asseyiez... et modélisez 13:19:12 bingo... vous vous dites que 4 modèles feront le boulot 13:19:29 on va commencer par 2 : 13:19:38 Etablissement 13:19:41 Personne 13:19:43 l'idée étant que des Personnes seront rattachées à des Établissements (en tant que professeurs... par exemple, mais ça pourrait être autre chose) 13:20:14 il faut comprendre ça : car c,est le projet 13:20:24 bertille.lekeufack@jabber.org a quitté le salon 13:20:35 davin.baragiotta 13:20:43 aujourd'hui on va gérer CES données dans l,admin le projet c'est la cartographie... on va l'appeler carto 13:20:58 dans votre ligne de commande... avec interpréteur Python lancé dans le contexte virtuel "atelier" 13:21:31 lancez ceci : 13:21:40 en fait... quittez Python 13:21:53 exit() 13:21:57 et tapez ceci : (atelier)~$ django-admin.py startproject carto 13:23:31 (le script django-admin.py = la porte d'entrée de Django... au début...) 13:24:08 progfou 13:24:27 ‎[09:23:59] ‎ongolaBoy‎: Q: django-admin == django-admin.py ?? davin.baragiotta 13:24:28 regardez l,arborescence des fichiers sous django ongolaBoy: sur Mac faut pas le .py, je crois... 13:24:48 et là j'ai essayé ceci : python django-admin.py startproject carto 13:24:57 et ça marche pas avec python devant... 13:25:03 c'est pénible 13:25:07 mais avec ce que j'ai mis plus haut : tout devrait marcher 13:25:20 progfou 13:25:20 ‎[09:24:41] ‎sekou.diall‎: Question : on la cmd django-admin.py startproject carto dans le dossier django précedement crée ? davin.baragiotta 13:25:25 (atelier)~$ django-admin.py startproject carto oui, dans le django précédamment créé 13:25:38 et plus que ça 13:25:42 avec (atelier)~$ activé 13:25:57 ah je devrais donc écrire ceci : 13:26:04 (atelier)~/django$ django-admin.py startproject carto 13:26:31 ok, à partir de maintenant... TOUT est TOUJOURS dans : (atelier)~/django$ 13:27:03 je vais juste écrire $ 13:27:16 on me sui un peu? 13:27:24 nous reste une heure là... 13:27:29 progfou 13:28:13 quelques un(e)s encore bloqué sur la fin de la mise en place de virtualenv + django, mais ça va venir davin.baragiotta 13:28:29 bon, alors regardez les fichiers créés dans le répertoire carto on voit manage.py 13:28:59 et un autre répertoire carto 13:29:09 manage.py représente maintenant Django... 13:29:17 on ne parlera qu'à lui 13:29:22 (plus à django-admin.py) 13:29:29 regardons maintenant le contenu de carto/carto/ 13:29:42 4 fichiers : * __init__.py 13:29:59 * settings.py * urls.py * wsgi.py 13:30:14 commentaire un par un 13:30:21 __init__.py : dans ton répertoire où il y a ce type de fichier... ce répertoire est une "module python" 13:30:49 ça permet de faire des import 13:30:59 donc c'est possible de coder dans nos scripts : import carto 13:31:14 c'est tout, on fait rien avec __init__ 13:31:27 settings... comme son nom l'indique... c,est la config 13:31:37 fred-juvenal.namsionou a quitté le salon 13:31:49 davin.baragiotta 13:32:00 on va y revenir au besoin * wsgi.py : sert juste pour déploiement en PROD... on touche pas 13:32:15 * urls.py : ça c'est notre porte d'entrée pour notre app 13:32:38 toute requête passe par là au début 13:32:50 urls.py = dispatcher... en fonction du patron d'URL, il assigne la fonction qui va retourne la réponse 13:33:19 fred-juvenal.namsionou a rejoint le salon 13:33:21 davin.baragiotta 13:33:22 on y revient eric.mcsween a rejoint le salon 13:33:26 davin.baragiotta 13:33:29 bieeeeeeen! on a un projet progfou 13:33:39 ‎[09:33:29] ‎ongolaBoy‎: Q: settings.py est placé dans .gitignore pour nos projets ? davin.baragiotta 13:33:45 la commande "startproject" n'a rien fait d,autre que de créer ces fichiers à notre place ongolaBoy: non... on doit suivre les settings 13:33:59 mais 13:34:00 on ne veut pas suivre certains params de config 13:34:09 comme les paramètres d'accès à la base de données 13:34:21 donc ces paramètres là seront extraits de settings.py... 13:34:33 pour être mis dans un conf.py 13:34:39 qui LUI sera ignoré par git 13:34:46 (et importé par settings.py... pour que la config reste accessible à Django) 13:35:07 ok, on n,a toujours pas fait grand chose : juste créé la strucutre de départ du projet 13:35:22 questions? 13:35:25 on continue 13:35:55 progfou 13:35:57 pas pour le moment ‎[09:36:03] ‎sekou.diall‎: Question : On peut dire urls.py jour le rôle de controleur ( MVC ) pour le framework Django ? 13:36:08 davin.baragiotta 13:36:25 en partie, oui... avec les views.py (voir le schéma... je crois que j'avais mis MVC à coté des fichiers) 13:36:42 (ou views n'est pas V de MVC... ce sont les templates qui sont le V) 13:37:11 ok maintenant, lançons le serveur de développement 13:37:35 pour qu'on nous "serve" notre nouveau projet dans un browser!!! :D 13:37:52 allez dans le répertoire carto/ (le premier) 13:38:26 django/carto/ 13:38:30 (atelier)~/django/carto/$ python manage.py runserver 13:39:19 Django nous dit qu'il sert l'application à http://127.0.0.1:8000 13:39:54 allons y avec browser 13:40:02 (navigateur web :) ) 13:40:15 super!!!! 13:40:24 It works! 13:40:27 On a un site Django! Hourra! 13:40:34 mais bon, comme le dit le message... on a encore rien fait ;) 13:40:45 lisons les étapes 13:40:54 si tu veux une base de données... modifie la config DATABASES dans settings 13:41:17 bien sûr qu'on en veut une... comment stocker les Etablissements et Personnes sinon 13:41:33 (oui y,a d'autres moyen... mais on veut une DB SQL) 13:41:59 alors éditer settings.py 13:42:12 on a ça par défaut : DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': '', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } } 13:42:47 on va utiliser une DB SQLite... car on a tout ce qu'il faut en Python, dans la standard library pour travailler avec sqlilte 13:43:29 (pas besoin d'installer les pilotes pour MySQl, par ex) 13:43:44 mais dans la vraie vie... sqlite n'est pas vraiment recommandé pour PROD 13:43:58 on prendra MySQL ou Postgresql (alors faudra les pilotes Python pour parler avec) 13:44:18 alors, en lisant les commentaires 13:44:25 on devrait avoir ceci au final : DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'carto.db', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } } 13:44:53 en gros, ENGINE et NAME modifié 13:45:02 je vous laisse éditer et sauvegarder 13:45:10 progfou 13:45:27 ‎[09:45:23] ‎progfou‎: Q: pourquoi sqlite2 et pas sqlite3 comme proposé ? davin.baragiotta 13:45:35 oui... 3... je dors donc : DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'carto.db', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } } 13:45:54 ok? 13:46:09 bon, si on se rappelle le message sur notre page web par defaut... outre settings... 13:46:47 il nous dit de créer une "application" 13:46:57 alors, qu'est-ce qu'une application 13:47:08 disons que c'est un "regroupement de trucs" qui sont reliés... 13:47:26 dans le génie logiciel, on cherche à éviter des dépendances entre chose pas reliées 13:47:52 donc on peut se dire qu'on va se créer une application "annuaire" 13:48:09 dans beaucoup de projet, on voit une application "core" qui sont but et de gérer les notions centrales du projet 13:48:30 je ne veux pas débattre ici du terme à choisir... même si dans un vrai projet ce serait le moment 13:48:51 appelons notre première application du projet "annuaire"... 13:49:03 on pourrait penser à une application future "recherche" pour gérer tous les aspects de la recherche scientifique d'un établissement 13:49:29 alors créons annuaire (comme dans le document de présentation) 13:49:45 la commande est "startapp"... 13:49:54 on a vu "stratproject"... là on start une app 13:50:04 (atelier)~django/carto$ python manage.py startapp annuaire 13:50:37 ah... aussi... vous pouvez "laisser votre serveur rouler" 13:50:52 et ouvrir un autre onglet 13:50:57 assurez-vous que l'environnement virtuel est bien là (atelier) 13:51:15 pour mémoire, on l,acgtive avec : source atelier/bin/activate 13:51:36 (évidemment, mettre les bons path... atelier/ et carto/ sont les 2 sous django/ ) 13:51:56 progfou 13:52:00 je leur fais un résumé des commandes régulièrement ;-) davin.baragiotta 13:52:06 j'ai vu, merci car au final on fait pas grand chose... le challenge = comprendre ce qui se passe 13:52:22 progfou 13:52:46 ‎[09:52:39] ‎ongolaBoy‎: Q: Il faut s'assurer dêtre dans l'environnement virtuel quand on veut exécuter une commande n'est-ce pas ? Si on souhaite modifier des fichiers, on peut être en dehors je suppose ? davin.baragiotta 13:53:44 oui... modifier fichier on fait comme on veut moi je suis en mode graphique : nautilus + gedit... il ne connaisse pas mon environnement virtuel Python 13:54:04 équivalent en ligne de commande = direct ls et vi, emacs... 13:54:20 (environnement activé ou pas) 13:54:29 venv : impacte juste l'univers Python en disant quel module Python prendre où 13:54:50 giotta@machina:~/django/carto$ cd .. giotta@machina:~/django$ source atelier/bin/activate (atelier)giotta@machina:~/django$ cd carto (atelier)giotta@machina:~/django/carto$ python manage.py startapp annuaire 13:55:02 hourra! on a une première app! 13:55:12 ok, on regarde ce que ça a fait 13:55:41 ça a créé un répertoire annuaire 13:55:46 regardons son contenu 13:55:52 le répertoire est à côté de carto 13:56:14 django/carto/annuaire 13:56:24 ça là que tout le reste des fichiers résident... ceux qui vont faire le boulot pour retourner une réponse HTTP (HTML/CSS, etc.) à la requête web reçue 13:57:10 carto/carto/urls.py va dispatcher à une fonction de carto/annuaire/views.py 13:57:41 views.py = les fonctions qui codent la logique de traitement 13:57:53 ex.: tu veux voir la liste des Établissements? voici le traitement informatique pour l'obtenir 13:58:13 (on verra plus en détail dans atelier Frontend) 13:58:21 test.py : c,est pour écrire suite de test... 13:58:35 on le fera pas 13:58:38 mais faudrait dans atelier Frontend ;) 13:58:48 __init__.py : même rôle que l'autre... c'est une convention Python pour créer un module 13:59:06 on peut donc faire : import annuaire 13:59:14 ou mieux : import carto.annuaire 13:59:24 voilà 13:59:29 reste donc models.py 13:59:34 c'est là qu'on va coder la modélisation qu'on a faite 13:59:44 on avait dit quoi? 13:59:48 ah oui... on a modélisé des Établissements et des Personnes... 13:59:58 sans plus tarder... codons 14:00:24 éditer le fichier models.py 14:00:31 on a déjà : from django.db import models # Create your models here. 14:00:59 mais comment créer les modèles? 14:01:09 victor.bruneau a quitté le salon 14:01:10 davin.baragiotta 14:01:18 comment les coder? suivez la doc pour apprendre... moi je ne fais que vous guider rapidement 14:01:34 doc django : 14:01:39 https://docs.djangoproject.com/en/1.4/ 14:01:53 (attentino à la version) 14:01:58 ok, sur accueil... on voit direct "model layer" 14:02:10 ahaha facile! 14:02:13 on veut les écrire... "model syntax" 14:02:25 super! 14:02:26 victor.bruneau a rejoint le salon 14:02:31 davin.baragiotta 14:02:59 je vous dispense de lire tout ça... mais ça fait 20 pages imprimées... ça se lit bien (pour peu qu'on lise l'anglais technique) alors voici en résumé : 14:03:10 un modèle, c'est une class Python 14:03:19 mais 14:03:23 pour avoir la magie de Django... on va la faire hériter d'un modèle type de django 14:03:47 class Etablissement(models.Model): pass 14:04:16 idem pour Personne 14:04:23 conventions : noms de classe en CamelCase 14:04:34 (singulier aussi) 14:04:41 pour ceux que ça intéresse, je code les modèles ici en live : 14:06:14 https://coderpad.io/771405 14:06:15 ça donne ça : from django.db import models class Etablissement(models.Model): pass class Personne(models.Model): pass 14:07:10 maintenant... on va ajouter des champs à ces modèles... 14:07:42 quelle info pour un établissement? 14:07:52 hmm... au moins un nom... un sigle aussi tiens 14:08:07 ajoutons ça 14:08:10 mais comment coder des champs? 14:08:18 documentation : accueil, sous model layer 14:08:25 field types... parfait! 14:08:37 https://docs.djangoproject.com/en/1.4/ref/models/fields/ 14:09:00 on voit dans colonne de droite, sous field types, tous les types de champs qui existent dans Django 14:09:25 un nom... ça pourrait être quoi? 14:09:31 ah, CharField, cool 14:09:38 parfait pour sigle en fait... 14:09:42 commençons avec ça 14:09:47 bertille.lekeufack a rejoint le salon 14:09:48 davin.baragiotta 14:09:52 je code dans le pad live si on lit la doc de CharField... 14:10:35 on voit qu'un param est obligatoire : la longueur de caractères 14:10:49 max_length 14:10:52 une personne aura un nom... 14:11:29 un prénom aussi tiens 14:11:36 ok, ajoutons une date de naissance à une personne... 14:12:06 quel champ? 14:12:09 voir la doc 14:12:11 colonne de droite 14:12:14 DateField (on n,a pas beosin de l'heure) 14:12:51 hop, on code... (y,a des params obligatoires pour ça? apparemment pas) 14:13:16 ça donne ceci : from django.db import models class Etablissement(models.Model): nom = models.CharField(max_length=255) sigle = models.CharField(max_length=255) class Personne(models.Model): nom = models.CharField(max_length=255) prenom = models.CharField(max_length=255) date_naissance = models.DateField() 14:13:48 sauvegarder le fichier 14:13:56 ok des questions sur comment coder un modèle? 14:14:19 (ou autre) 14:14:24 ok on va terminer le travail sur notre app 14:15:02 en "installant" l'app dans le projet 14:15:10 (oui, ç'aurait été mieux que Django le fasse pour nous ;) ) 14:15:23 dans le fihciher settings (éditer) 14:15:30 dans le param INSTALLED_APPS 14:15:39 ajouter la ligne : 'annuaire', 14:15:47 INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'annuaire', ) 14:16:40 save 14:16:47 bon, alors notre app est presque prête... 14:17:02 progfou 14:17:10 ‎[10:17:05] ‎progfou‎: Q: c'est 'annuaire' ou 'carto.annuaire' ? lequel est officiellement recommandé ? davin.baragiotta 14:17:20 carto.annuaire non ambigu 14:17:28 ok, atteint un objectif : comprendre les fichiers d'un projet 14:18:00 on veut maintenant gérer les données dans l'admin 14:18:11 on va donc "activer" l'admin 14:18:19 PARTIE 3 : BACKEND (ADMIN) 14:18:33 dans carto/urls.py 14:18:39 décommenter les lignes de l'admin 14:18:49 ĉa donne ça : from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'carto.views.home', name='home'), # url(r'^carto/', include('carto.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), ) 14:19:24 là l'urls est prêt à dispatcher tout derrière /admin/ vers (une views?) de l'admin Django... 14:19:59 ... mais l'app admin est pas installé je crois ;) 14:20:07 carto/settings.py 14:20:14 INSTALLED_APPS 14:20:18 décommenter admin 14:20:22 INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'annuaire', ) 14:20:42 (admindocs pas important) 14:20:49 voilà... l,admin est activé... notre app aussi... 14:21:02 mais lions maintenant nos modèles à l'admin 14:21:12 on veut dire ceci : "hey... ce modèle peut être géré dans l'admin" 14:21:26 on se crée un fichier admin dans notre app : 14:21:37 annuaire/admin.py 14:21:44 quoi y mettre ? 14:22:15 lire la doc de l,admin sur le web : 14:22:21 sur accueil, sous "other batteries included" 14:22:59 Admin site 14:23:03 https://docs.djangoproject.com/en/1.4/ref/contrib/admin/ 14:23:12 je vous donne donc en live ce qu'il faut coder 14:23:25 https://coderpad.io/771405 14:23:38 on veut juste enregistrer nos modèles dans l,admin 14:25:03 c'est presque pas du code là... on configure! 14:25:13 from django.contrib import admin from carto.annuaire.models import Etablissement, Personne admin.site.register(Etablissement) admin.site.register(Personne) 14:26:02 voila 14:26:07 save 14:26:08 ok on devrait avoir tout 14:26:12 allons voir ce qui se passe sur l'accueil (le serveur doit toujours rouler) 14:26:24 http://127.0.0.1:8000/ 14:26:37 refresh 14:26:40 ach! 14:26:52 progfou 14:26:55 (non, on avait faire un ctrl+c ;-) ) RAPPEL : lancer python manage.py runserver davin.baragiotta 14:26:58 il dit 404... (atelier)~/django/carto/$ python manage.py runserver 14:27:36 ok donc on a 404 14:27:51 pourquoi? 14:27:54 si on se souvient... le point d'entrée, c'est urls.py 14:28:06 ce sont les règles (patrons) d'URL géré... 14:28:16 on a quoi comme règle 14:28:22 regardons 14:28:28 from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'carto.views.home', name='home'), # url(r'^carto/', include('carto.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), ) 14:28:37 seulement "admin/" 14:28:46 (les r'' = string raw) 14:29:06 ^ = regex, début obligatoire de l'expression 14:29:23 je passe détail regex : voir la doc Python officielle au besoin, dans standard library, module re 14:29:46 ok donc 14:29:49 on gère admin 14:29:58 donc, on va mettre dans l'URL... /admin 14:30:06 http://127.0.0.1:8000/admin/ 14:30:29 autre erreur : on n,a pas les tables qu'ils faut dans l,admin 14:30:43 alors dernière opération (normale)... 14:30:54 syncrhoniser la DB avec les modèles nécessaires pour les apps 14:31:13 (la nôtre, annuaire... mais aussi celle de l'admin) 14:31:23 (atelier)~django/carto$ python manage.py syncdb 14:31:40 oui, créez un user admin bidon 14:31:51 user : admin 14:31:53 mdp : admin 14:31:55 courriel (n'importe) 14:32:03 http://127.0.0.1:8000/admin/ 14:32:52 voilà l'admin 14:33:10 si tout va bien... vous voyez 14:33:19 Etablissements 14:33:22 Personnes 14:33:24 prêt à être géré dans l,admin 14:33:32 des questions? 14:33:35 (je suis en retard... et Tri attend :-/ ) 14:33:52 la vraie conclusion : 14:34:19 on n,a presque rien fait 14:34:24 progfou 14:34:28 ‎[10:34:24] ‎progfou‎: REMARQUE: ça marche pas avec l'application 'carto.annuaire', sans doute une histoire de chemin… j'ai dû mettre 'annuaire' pour que ça passe davin.baragiotta 14:34:34 et ce qu'on a fait... on le fait une fois dans un projet (au début) reste à voir comment améliorer la gestion dans admin : 14:34:54 lire la doc admin et modifier admin.py 14:35:01 c'est tout 14:35:03 le reste = atelier Django Frontend demain... suivi de Django inspectdb par olivier 14:35:23 (pour reprendre données d'une DB existante) 14:35:32 questions rapides? 14:35:40 progfou 14:36:45 je pense que tu peux déborder un peu, genre 15 min, si tu as besoin avec l'accord du présentateur suivant ;) 14:36:55 davin.baragiotta 14:37:50 magnifique progfou 14:38:14 ‎[10:38:11] ‎sekou.diall‎: Question : j'ai une erreur IndentationError at /adminunexpected indent (urls.py, line 5) davin.baragiotta 14:38:38 en Python l'indentention est importante... obligatoire 14:38:47 compte des espaces au besoin ;) 14:38:54 (mais configure ton éditeur pour que touche tab donne 4 espaces ; c'est le mieux... même gedit peut faire ça) 14:39:17 ou copie-colle le code du pad, il marche 14:39:49 sekou.diall 14:40:01 -ok davin.baragiotta 14:40:04 (après modif proposée par jc ) https://coderpad.io/771405 14:40:19 autres questions? 14:40:29 un question pertinente serait : comment lier les Personne aux Etablissements 14:41:04 réponse : modifier les modèles en conséquence, dans models.py 14:41:14 en ajoutant les champs requis qu'on trouve dans la doc 14:41:25 en l'occurence : ForeignKey 14:41:32 qui lit un modèle vers autre 14:41:39 (y'a aussi ManyToMany... de mémoire) 14:41:50 claudine.mosozi 14:44:25 oui pardon 14:44:33 davin.baragiotta 14:51:00 ---------------------------------- FIN Atelier Django Backend ---------------------------- }}}