Taille: 7454
Commentaire: Premier jet : format wiki redmine, contenu Montréal-Python
|
Taille: 6037
Commentaire: reformet puces et contenu
|
Texte supprimé. | Texte ajouté. |
Ligne 1: | Ligne 1: |
h1. Plan détaillé h2. INTRODUCTION * Présentations ** Davin Baragiotta ** Montréal-Python (MP, sprints/hackathons, ateliers, PyCon) * Objectifs ** connaître l'architecture d'un projet : principaux fichiers ** gérer data dans backend ** présenter data dans frontend * Documentation ** doc : bonne version de django *** officielle : https://docs.djangoproject.com/en/1.3/ *** français : http://docs.django-fr.org/ ** tutoriel *** Part 1 : créer un projet, créer une app, jouer avec ORM (API) _couvert ici_ *** Part 2 : backend (admin) _couvert ici_ *** Part 3 : frontend _couvert ici, plus straightforward même ;)_ *** Part 4 : forms et vues génériques _pas couvert ici_ * Environnement technique ** Python >= 2.5 ** Django 1.3.1 *** Mac OS X : voir tutoriel Part 1 pour manip supplémentaire h2. PARTIE 1 : DÉVELOPPEMENT WEB AVEC DJANGO : ARCHITECTURE D'UN PROJET h3. Développement web * schéma : le développement web ** rôle d'un framework web : aider à construire réponse à une requête * développement (DEV) * déploiement (PROD, TEST) h3. Django Pourquoi django vs autre framework * all-in-one * admin : meilleur vendeur ;) * docs * communauté : utilisation répandue |
= Atelier 2011-12-12 : Plan détaillé = == INTRODUCTION == * Objectifs * connaître l'architecture d'un projet : principaux fichiers * présenter data dans frontend * Documentation * doc : bonne version de django * officielle : https://docs.djangoproject.com/en/1.1/ * français : http://docs.django-fr.org/ * tutoriel * Part 1 : créer un projet, créer une app, jouer avec ORM (API) ''convert en partie lors de atelier 2011-12-07'' * Part 2 : backend (admin) ''convert lors de atelier 2011-12-07'' * Part 3 : frontend _couvert ici, plus efficacement même ;)_ * Part 4 : forms et vues génériques _pas couvert ici_ * Environnement technique * Python >= 2.5 * Django 1.1.1 * Mac OS X : voir tutoriel Part 1 pour manip supplémentaire == PARTIE 1 : RAPPELS == === Django === |
Ligne 44: | Ligne 27: |
* models.py * admin.py * urls.py * views.py * templates (HTML) h3. Projet : définition du besoin Montréal-Python a une ligue de hockey cosom _(ce n'est pas vrai)_. On veut gérer quels joueurs sont dans quelles équipes... ... et planifier les matchs de la saison. h3. Projet : modélisation * Joueur * Equipe * Match h2. PARTIE 2 : HANDS-ON : PROJET ET APPLICATIONS h3. Création du projet <pre> django-admin.py startproject liguemp cd liguemp </pre> * survol des fichiers générés <pre> python manage.py runserver </pre> * settings.py ** DATABASE_* h3. Création d'une application <pre> python manage.py startapp recrutement </pre> * survol fichiers * recrutement/models.py ** documentation : https://docs.djangoproject.com/en/1.3/topics/db/models/ https://docs.djangoproject.com/en/1.3/ref/models/fields/ ** yeah! on code! *** Joueur.nom *** Equipe.nom * settings.py ** INSTALLED_APP *** 'recrutement' <pre> python manage.py syncdb </pre> h3. Backend : gérer les données dans l'admin * urls.py _activer admin : décommenter_ ** import ** autodiscover ** url : admin/ * http://127.0.0.1:8000/ * settings.py ** INSTALLED_APP *** 'django.contrib.admin' * recrutement/admin.py _enregistrer modèles voir tutoriel Part 2_ https://docs.djangoproject.com/en/1.3/intro/tutorial02/ * http://127.0.0.1:8000/admin/ * recrutement/models.py <pre>def __unicode__(self):</pre> ** Joueur.prenom * delete liguemp.db <pre> python manage.py syncdb </pre> > fixtures > https://docs.djangoproject.com/en/1.3/ref/django-admin/ > > south > http://south.aeracode.org/ * recrutement/models.py ** Joueur.equipe h3. Frontend : présenter les données * recrutement/urls.py |
* models.py * admin.py * urls.py * views.py * templates (HTML) === Projet carto : définition du besoin === L'AUF veut procéder à la cartographie de ses établissements membres. On veut savoir quelle formation est donnée où... ... et répertorier les projets des membres. === Projet carto : modélisation === * Etablissement * Formation * Projet == PARTIE 2 : HANDS-ON : PROJET ET APPLICATIONS == === Télécharger les sources initiales === Repartir du projet créé lors de l'atelier du 2011-12-07. Nous avions alors : * Créé le projet carto * Créé l'application etablissements * Créé les modèles Etablissement et Formation * Géré dans l'admin des Etablissements et des Formations === Frontend : présenter les données === * recrutement/urls.py |
Ligne 148: | Ligne 60: |
** home * recrutement/views.py |
* home * recrutement/views.py |
Ligne 155: | Ligne 67: |
* templates | * templates |
Ligne 157: | Ligne 69: |
** créer répertoire templates ** settings.py <pre> |
* créer répertoire templates * settings.py {{{ |
Ligne 162: | Ligne 74: |
</pre> ** templates/recrutement/home.html * recrutement/views.py |
}}} * templates/recrutement/home.html * recrutement/views.py |
Ligne 168: | Ligne 80: |
* templates/recrutement/home.html | * templates/recrutement/home.html |
Ligne 170: | Ligne 82: |
<pre> | {{{ |
Ligne 172: | Ligne 84: |
</pre> * recrutement/views.py |
}}} * recrutement/views.py |
Ligne 178: | Ligne 90: |
<pre> | {{{ |
Ligne 180: | Ligne 92: |
</pre> * ORM (API) : object relation mapping <pre> |
}}} * ORM (API) : object relation mapping {{{ |
Ligne 194: | Ligne 106: |
</pre> * recrutement/models.py <pre> |
}}} * recrutement/models.py {{{ |
Ligne 199: | Ligne 111: |
</pre> * relancer shell <pre> |
}}} * relancer shell {{{ |
Ligne 205: | Ligne 117: |
</pre> * recrutement/views.py |
}}} * recrutement/views.py |
Ligne 210: | Ligne 122: |
* templates/recrutement/home.html | * templates/recrutement/home.html |
Ligne 212: | Ligne 124: |
<pre> | {{{ |
Ligne 215: | Ligne 127: |
</pre> h2. PARTIE 3 : PROJET LIGUEMP PIMPÉ |
}}} == PARTIE 3 : PROJET LIGUEMP PIMPÉ == |
Ligne 226: | Ligne 138: |
h3. Héritage de templates * base.html <pre> |
=== Héritage de templates === * base.html {{{ |
Ligne 231: | Ligne 143: |
</pre> * templates <pre> |
}}} * templates {{{ |
Ligne 237: | Ligne 149: |
</pre> h3. Fichiers statiques : CSS, images et js |
}}} === Fichiers statiques : CSS, images et js === |
Ligne 243: | Ligne 155: |
* répertoire : static ** css ** images ** js * settings.py ** STATICFILES_DIRS <pre> |
* répertoire : static * css * images * js * settings.py * STATICFILES_DIRS {{{ |
Ligne 252: | Ligne 164: |
</pre> * urls.py <pre> |
}}} * urls.py {{{ |
Ligne 258: | Ligne 170: |
</pre> h3. Connexion du user * templates ** connexion.html ** deconnexion.html * urls.py ** connexion ** deconnexion * settings.py <pre> |
}}} === Connexion du user === * templates * connexion.html * deconnexion.html * urls.py * connexion * deconnexion * settings.py {{{ |
Ligne 273: | Ligne 185: |
</pre> h3. URL avec paramètres * pages de détail : capter l'id de l'objet ** urls.py : import des urls de l'app recrutement ** recrutement/urls.py ** recrutement/views.py ** templates/recrutement/* h3. Refactoring du home * urls home dans views.py à la racine h3. Admin pimpé : ModelAdmin * recrutement/admin.py * classes JoueurAdmin, EquipeAdmin |
}}} === URL avec paramètres === * pages de détail : capter l'id de l'objet * urls.py : import des urls de l'app recrutement * recrutement/urls.py * recrutement/views.py * templates/recrutement/* === Refactoring du home === * urls home dans views.py à la racine === Admin pimpé : ModelAdmin === * recrutement/admin.py * classes JoueurAdmin, EquipeAdmin |
Ligne 293: | Ligne 205: |
** enregistrer Modele avec ModeleAdmin <pre> |
* enregistrer Modele avec ModeleAdmin {{{ |
Ligne 296: | Ligne 208: |
</pre> ** config ModeleAdmin <pre> |
}}} * config ModeleAdmin {{{ |
Ligne 302: | Ligne 214: |
</pre> ** plus? |
}}} * plus? |
Ligne 305: | Ligne 217: |
*** fields *** fieldsets h3. Charger données initiales : fixtures |
* fields * fieldsets === Charger données initiales : fixtures === |
Ligne 312: | Ligne 224: |
* créer répertoire fixtures à la racine <pre> |
* créer répertoire fixtures à la racine {{{ |
Ligne 316: | Ligne 228: |
</pre> * mettre initial_data.json dans fixtures * pour récupération data : <pre> |
}}} * mettre initial_data.json dans fixtures * pour récupération data : {{{ |
Ligne 325: | Ligne 237: |
</pre> h2. PARTIE 4 : HANDS-ON : CRÉER L'APPLICATION SAISON POUR LE PROJET LIGUEMP h3. Ajouter modèle Match * Match ** date ** lieu ** equipe1 ** equipe2 ** score1 ** score2 h3. Autre exercice : age d'un joueur * Joueur.date_naissance * Joueur.age() |
}}} == PARTIE 4 : HANDS-ON : CRÉER L'APPLICATION SAISON POUR LE PROJET LIGUEMP == === Ajouter modèle Match === * Projet * date * lieu * equipe1 * equipe2 * score1 * score2 === Autre exercice : age d'un joueur === * Joueur.date_naissance * Joueur.age() |
Ligne 345: | Ligne 257: |
h2. CONCLUSION : POUR CONTINUER * Autres aspects non couverts (quelques uns) ** permissions et décorateurs ** manage.py inspectdb ** manage.py test ** forms ** generic views ** templates : tags, filtres * Mailing list Django users : |
== CONCLUSION : POUR CONTINUER == * Autres aspects non couverts (quelques uns) * permissions et décorateurs * manage.py inspectdb * manage.py test * forms * generic views * templates : tags, filtres * Mailing list Django users : |
Ligne 358: | Ligne 270: |
* Channel IRC #django : | * Channel IRC #django : |
Ligne 361: | Ligne 273: |
* Contribs, plugins | * Contribs, plugins |
Ligne 363: | Ligne 275: |
** south ** reversion ** Autre : pypi |
* south * reversion * Autre : pypi |
Ligne 368: | Ligne 280: |
* Enjoy! h2. SONDAGE DE SATISFACTION * http://www.surveymonkey.com/s/XKP2NP7 |
* Enjoy! |
Atelier 2011-12-12 : Plan détaillé
INTRODUCTION
- Objectifs
- connaître l'architecture d'un projet : principaux fichiers
- présenter data dans frontend
- Documentation
- doc : bonne version de django
officielle : https://docs.djangoproject.com/en/1.1/
français : http://docs.django-fr.org/
- tutoriel
Part 1 : créer un projet, créer une app, jouer avec ORM (API) convert en partie lors de atelier 2011-12-07
Part 2 : backend (admin) convert lors de atelier 2011-12-07
- Part 3 : frontend _couvert ici, plus efficacement même ;)_
- Part 4 : forms et vues génériques _pas couvert ici_
- doc : bonne version de django
- Environnement technique
Python >= 2.5
- Django 1.1.1
- Mac OS X : voir tutoriel Part 1 pour manip supplémentaire
PARTIE 1 : RAPPELS
Django
Principaux fichiers
- models.py
- admin.py
- urls.py
- views.py
- templates (HTML)
Projet carto : définition du besoin
L'AUF veut procéder à la cartographie de ses établissements membres. On veut savoir quelle formation est donnée où... ... et répertorier les projets des membres.
Projet carto : modélisation
- Etablissement
- Formation
- Projet
PARTIE 2 : HANDS-ON : PROJET ET APPLICATIONS
Télécharger les sources initiales
Repartir du projet créé lors de l'atelier du 2011-12-07. Nous avions alors :
- Créé le projet carto
- Créé l'application etablissements
- Créé les modèles Etablissement et Formation
- Géré dans l'admin des Etablissements et des Formations
Frontend : présenter les données
- recrutement/urls.py
https://docs.djangoproject.com/en/1.3/topics/http/urls/
- home
- recrutement/views.py
https://docs.djangoproject.com/en/1.3/topics/http/views/ _voir tutoriel Part 3 (version shortcut)_ https://docs.djangoproject.com/en/1.3/intro/tutorial03/
- templates
https://docs.djangoproject.com/en/1.3/topics/templates/
- créer répertoire templates
- settings.py
os.path.join(os.path.dirname(__file__), "templates"), import os
- templates/recrutement/home.html
- recrutement/views.py
_passer une variable au template_
- templates/recrutement/home.html
_utiliser une variable :_
{{ var }}
- recrutement/views.py
_endroit où on code en logique en Python plus simple si explore interactivement..._
python manage.py shell
- ORM (API) : object relation mapping
from recrutement.models import * equipes = Equipe.objects.all() for e in equipes: print e e = equipes[0] e.joueur_set.all() j = Joueur.objects.get(id=1) j.id j = Joueur.objects.get(id=314) e.id joueurs = Joueur.objects.filter(equipe__nom__startswith='Pyth')
- recrutement/models.py
related_name = "joueurs"
- relancer shell
e.joueurs.all() e.joueurs.count()
- recrutement/views.py
_passer les variables pertinentes pour accueil_
- templates/recrutement/home.html
_boucle for dans template :_
{% for e in equipes %} {% endfor %}
PARTIE 3 : PROJET LIGUEMP PIMPÉ
Télécharger les sources du projet pimpé : http://montrealpython.org/r/attachments/8
Extraire (_sans clash de nom avec projet en cours_)
Pimpé? Quoi de neuf?
Héritage de templates
- base.html
{% block main %}
- templates
{% extends "base.html" %} {% block main %}
Fichiers statiques : CSS, images et js
https://docs.djangoproject.com/en/1.3/howto/static-files/
- répertoire : static
- css
- images
- js
- settings.py
- STATICFILES_DIRS
os.path.join(os.path.dirname(__file__), "static"),
- urls.py
from django.contrib.staticfiles.urls import staticfiles_urlpatterns urlpatterns += staticfiles_urlpatterns()
Connexion du user
- templates
- connexion.html
- deconnexion.html
- urls.py
- connexion
- deconnexion
- settings.py
LOGIN_REDIRECT_URL = "/"
URL avec paramètres
- pages de détail : capter l'id de l'objet
- urls.py : import des urls de l'app recrutement
- recrutement/urls.py
- recrutement/views.py
- templates/recrutement/*
Refactoring du home
- urls home dans views.py à la racine
Admin pimpé : ModelAdmin
- recrutement/admin.py
classes JoueurAdmin, EquipeAdmin
_héritent de ModelAdmin_
enregistrer Modele avec ModeleAdmin
admin.site.register(Joueur, JoueurAdmin)
config ModeleAdmin
list_display search_fields list_filter
- plus?
https://docs.djangoproject.com/en/1.3/ref/contrib/admin/
- fields
- fieldsets
Charger données initiales : fixtures
https://docs.djangoproject.com/en/1.3/ref/django-admin/
- créer répertoire fixtures à la racine
python manage.py dumpdata > initial_data.json
- mettre initial_data.json dans fixtures
- pour récupération data :
python manage.py syncdb no (pas créer user) python manage.py loaddata fixtures/initial_data.json
PARTIE 4 : HANDS-ON : CRÉER L'APPLICATION SAISON POUR LE PROJET LIGUEMP
Ajouter modèle Match
- Projet
- date
- lieu
- equipe1
- equipe2
- score1
- score2
Autre exercice : age d'un joueur
- Joueur.date_naissance
- Joueur.age()
_ajouter une methode age() sur la classe Joueur utilisant la date de naissance_
CONCLUSION : POUR CONTINUER
- Autres aspects non couverts (quelques uns)
- permissions et décorateurs
- manage.py inspectdb
- manage.py test
- forms
- generic views
- templates : tags, filtres
- Mailing list Django users :
http://groups.google.com/group/django-users
- Channel IRC #django :
- Contribs, plugins
https://docs.djangoproject.com/en/dev/ref/contrib/
- south
- reversion
- Autre : pypi
- Enjoy!