Modifications entre les versions 2 et 3
Version 2 à la date du 2011-12-12 04:54:06
Taille: 5631
Éditeur: DavinBaragiotta
Commentaire: Reformet titres et affichage code
Version 3 à la date du 2011-12-12 05:11:58
Taille: 6037
Éditeur: DavinBaragiotta
Commentaire: reformet puces et contenu
Texte supprimé. Texte ajouté.
Ligne 5: Ligne 5:
* 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
 * Objectifs
  * connaître l'architecture d'un projet : principaux fichiers
  * présenter data dans frontend
 * Documentation
  * doc : bonne version de djan
go
   
* 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 27: 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
 * 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
Ligne 47: Ligne 47:
=== 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
Ligne 49: Ligne 58:
* recrutement/urls.py  * recrutement/urls.py
Ligne 51: Ligne 60:
** home

* recrutement/views.py
  * home

 * recrutement/views.py
Ligne 58: Ligne 67:
* templates  * templates
Ligne 60: Ligne 69:
** créer répertoire templates
** settings.py
  * créer répertoire templates
  * settings.py
Ligne 66: Ligne 75:
** templates/recrutement/home.html

* recrutement/views.py
  * templates/recrutement/home.html

 * recrutement/views.py
Ligne 71: Ligne 80:
* templates/recrutement/home.html  * templates/recrutement/home.html
Ligne 77: Ligne 86:
* recrutement/views.py  * recrutement/views.py
Ligne 85: Ligne 94:
* ORM (API) : object relation mapping  * ORM (API) : object relation mapping
Ligne 99: Ligne 108:
* recrutement/models.py  * recrutement/models.py
Ligne 104: Ligne 113:
* relancer shell  * relancer shell
Ligne 110: Ligne 119:
* recrutement/views.py  * recrutement/views.py
Ligne 113: Ligne 122:
* templates/recrutement/home.html  * templates/recrutement/home.html
Ligne 131: Ligne 140:
* base.html  * base.html
Ligne 136: Ligne 145:
* templates  * templates
Ligne 146: Ligne 155:
* répertoire : static
** css
** images
** js

* settings.py
** STATICFILES_DIRS
 * répertoire : static
  * css
  * images
  * js

 * settings.py
  * STATICFILES_DIRS
Ligne 157: Ligne 166:
* urls.py  * urls.py
Ligne 165: Ligne 174:
* templates
** connexion.html
** deconnexion.html

* urls.py
** connexion
** deconnexion

* settings.py
 * templates
  * connexion.html
  * deconnexion.html

 * urls.py
  * connexion
  * deconnexion

 * settings.py
Ligne 180: Ligne 189:
* 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/*
 * 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/*
Ligne 188: Ligne 197:
* urls home dans views.py à la racine  * urls home dans views.py à la racine
Ligne 192: Ligne 201:
* recrutement/admin.py

* classes JoueurAdmin, EquipeAdmin
 * recrutement/admin.py

 * classes JoueurAdmin, EquipeAdmin
Ligne 196: Ligne 205:
** enregistrer Modele avec ModeleAdmin   * enregistrer Modele avec ModeleAdmin
Ligne 200: Ligne 209:
** config ModeleAdmin   * config ModeleAdmin
Ligne 206: Ligne 215:
** plus?   * plus?
Ligne 208: Ligne 217:
*** fields
*** fieldsets
   * fields
   * fieldsets
Ligne 215: Ligne 224:
* créer répertoire fixtures à la racine  * créer répertoire fixtures à la racine
Ligne 221: Ligne 230:
* mettre initial_data.json dans fixtures

* pour récupération data :
 * mettre initial_data.json dans fixtures

 * pour récupération data :
Ligne 234: Ligne 243:
* Match
** date
** lieu
** equipe1
** equipe2
** score1
** score2
 * Projet
  * date
  * lieu
  * equipe1
  * equipe2
  * score1
  * score2
Ligne 244: Ligne 253:
* Joueur.date_naissance
* Joueur.age()
 * Joueur.date_naissance
 * Joueur.age()
Ligne 250: Ligne 259:
* 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 :
 * 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 261: Ligne 270:
* Channel IRC #django :  * Channel IRC #django :
Ligne 264: Ligne 273:
* Contribs, plugins  * Contribs, plugins
Ligne 266: Ligne 275:
** south
** reversion
** Autre : pypi
  * south
  * reversion
  * Autre : pypi
Ligne 271: Ligne 280:
* Enjoy!  * 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
    • 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

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

_héritent de ModelAdmin_

admin.site.register(Joueur, JoueurAdmin)

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 :

irc://irc.freenode.net/django

  • Contribs, plugins

https://docs.djangoproject.com/en/dev/ref/contrib/

  • south
  • reversion
  • Autre : pypi

http://pypi.python.org/

  • Enjoy!

Ateliers/2011-12-12/PlanDetail (dernière édition le 2011-12-12 08:16:05 par DavinBaragiotta)