Modifications entre les versions 3 et 9 (s'étendant sur 6 versions)
Version 3 à la date du 2011-12-12 05:11:58
Taille: 6037
Éditeur: DavinBaragiotta
Commentaire: reformet puces et contenu
Version 9 à la date du 2011-12-12 06:56:28
Taille: 6383
Éditeur: DavinBaragiotta
Commentaire:
Texte supprimé. Texte ajouté.
Ligne 7: Ligne 7:
  * présenter data dans frontend   * présenter des données dans le frontend (interface publique) avec Django
Ligne 13: Ligne 13:
   * 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_
   * Part 1 : créer un projet, créer une app, jouer avec ORM (API) ''couvert en partie lors de atelier 2011-12-07''
   * Part 2 : backend (admin) ''couvert 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''
Ligne 36: Ligne 36:
Ligne 37: Ligne 38:
Ligne 47: Ligne 49:
=== Télécharger les sources initiales ===

Repartir du projet créé lors de l'atelier du 2011-12-07.
=== Repartir des sources initiales ===

Repartir du projet créé lors de l'atelier du 2011-12-07 : sources initiales
Ligne 58: Ligne 61:
 * recrutement/urls.py
https://docs.djangoproject.com/en/1.3/topics/http/urls/
 * urls.py
 https://docs.djangoproject.com/en/1.1/topics/http/urls/
Ligne 62: Ligne 65:
 * 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/
 * views.py
 https://docs.djangoproject.com/en/1.1/topics/http/views/

 ''
voir tutoriel Part 3 (version shortcut)''

 
https://docs.djangoproject.com/en/1.1/intro/tutorial03/
Ligne 68: Ligne 73:
https://docs.djangoproject.com/en/1.3/topics/templates/  https://docs.djangoproject.com/en/1.1/topics/templates/
Ligne 71: Ligne 76:
{{{
os.path.join(os.path.dirname(__file__), "templates"),
  {{{
Ligne 74: Ligne 78:
}}}
  * templates/recrutement/home.html

 * recrutement/views.py
_passer une variable au template_

 * templates/recrutement/home.html
_utiliser une variable :_
{{{
TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(os.path.dirname(__file__), "templates"),
)
}}}
  * templates/home.html

 * views.py
 ''passer une variable au template''

 * templates/home.html
 ''utiliser une variable :''
 {{{
Ligne 86: Ligne 96:
 * recrutement/views.py
_endroit où on code en logique en Python
plus simple si explore interactivement..._

{{{
 * views.py
 ''endroit où on code la logique en Python...''

 ''...
plus simple si explore interactivement''

 {{{
Ligne 94: Ligne 105:
 * ORM (API) : object relation mapping
{{{
from recrutement.models import *
equipes = Equipe.objects.all()
for e in equipe
s: print e
e = equipes[0]
e.joueur_set.all()
j = Joueur.objects.get(id=1)
j.id
j = Joueur
.objects.get(id=314)
 * ORM (API) : object relationnal mapping
 {{{
from etablissements.models import *
etablissements = Etablissement.objects.all()
for e in etablissement
s: print e
e = etablissements[0]
e.formation_set.all()
f = Formation.objects.get(id=1)
f.id
f = Formation
.objects.get(id=314)
Ligne 105: Ligne 116:
joueurs = Joueur.objects.filter(equipe__nom__startswith='Pyth')
}}}

 * recrutement/models.py
{{{
related_name = "joueurs"
formations = Formation.objects.filter(etablissement__nom__contains='Hanoi')
}}}

 * etablissements/models.py
 {{{
related_name = "formations"
Ligne 114: Ligne 125:
{{{
e.joueur
s.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 %}
 {{{
e.formation
s.all()
e.formations.count()
}}}

 * views.py
 ''passer les variables pertinentes pour accueil''

 * templates/home.html
 ''boucle for dans template :''
 
{{{
{% for e in etablissements %}
Ligne 134: Ligne 145:
Extraire (_sans clash de nom avec projet en cours_) Extraire (''sans clash de nom avec projet en cours'')
Ligne 141: Ligne 152:
{{{  {{{
Ligne 146: Ligne 157:
{{{  {{{
Ligne 153: Ligne 164:
https://docs.djangoproject.com/en/1.3/howto/static-files/ https://docs.djangoproject.com/en/1.1/howto/static-files/
Ligne 162: Ligne 173:
{{{   {{{
Ligne 167: Ligne 178:
{{{  {{{
Ligne 183: Ligne 194:
{{{  {{{
Ligne 204: Ligne 215:
_héritent de ModelAdmin_
 ''
héritent de ModelAdmin''
Ligne 206: Ligne 219:
{{{   {{{
Ligne 210: Ligne 223:
{{{   {{{
Ligne 215: Ligne 228:
  * plus?
https://docs.djangoproject.com/en/1.3/ref/contrib/admin/
  * plus? https://docs.djangoproject.com/en/1.1/ref/contrib/admin/
Ligne 222: Ligne 234:
https://docs.djangoproject.com/en/1.3/ref/django-admin/ https://docs.djangoproject.com/en/1.1/ref/django-admin/
Ligne 225: Ligne 237:

{{{
 {{{
Ligne 233: Ligne 244:
{{{  {{{
Ligne 255: Ligne 266:
_ajouter une methode age() sur la classe Joueur utilisant la date de naissance_  ''ajouter une methode age() sur la classe Joueur utilisant la date de naissance''
Ligne 268: Ligne 279:
http://groups.google.com/group/django-users  http://groups.google.com/group/django-users
Ligne 271: Ligne 282:
irc://irc.freenode.net/django  irc://irc.freenode.net/django
Ligne 274: Ligne 285:
https://docs.djangoproject.com/en/dev/ref/contrib/  https://docs.djangoproject.com/en/dev/ref/contrib/
Ligne 278: Ligne 289:
http://pypi.python.org/  http://pypi.python.org/

Atelier 2011-12-12 : Plan détaillé

INTRODUCTION

  • Objectifs
    • connaître l'architecture d'un projet : principaux fichiers
    • présenter des données dans le frontend (interface publique) avec Django
  • Documentation
    • doc : bonne version de django
    • tutoriel
      • Part 1 : créer un projet, créer une app, jouer avec ORM (API) couvert en partie lors de atelier 2011-12-07

      • Part 2 : backend (admin) couvert 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

Repartir des sources initiales

Repartir du projet créé lors de l'atelier du 2011-12-07 : sources initiales

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

  • urls.py

    https://docs.djangoproject.com/en/1.1/topics/http/urls/

    • home
  • views.py

    https://docs.djangoproject.com/en/1.1/topics/http/views/

    voir tutoriel Part 3 (version shortcut)

    https://docs.djangoproject.com/en/1.1/intro/tutorial03/

  • templates

    https://docs.djangoproject.com/en/1.1/topics/templates/

    • créer répertoire templates
    • settings.py
      import os
      TEMPLATE_DIRS = (
          # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
          # Always use forward slashes, even on Windows.
          # Don't forget to use absolute paths, not relative paths.
          os.path.join(os.path.dirname(__file__), "templates"),
      )
    • templates/home.html
  • views.py

    passer une variable au template

  • templates/home.html

    utiliser une variable :

    {{ var }}
  • views.py

    endroit où on code la logique en Python...

    ...plus simple si explore interactivement

    python manage.py shell
  • ORM (API) : object relationnal mapping
    from etablissements.models import *
    etablissements = Etablissement.objects.all()
    for e in etablissements: print e
    e = etablissements[0]
    e.formation_set.all()
    f = Formation.objects.get(id=1)
    f.id
    f = Formation.objects.get(id=314)
    e.id
    formations = Formation.objects.filter(etablissement__nom__contains='Hanoi')
  • etablissements/models.py
    related_name = "formations"
  • relancer shell
    e.formations.all()
    e.formations.count()
  • views.py

    passer les variables pertinentes pour accueil

  • templates/home.html

    boucle for dans template :

    {% for e in etablissements %}
    {% 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.1/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

Charger données initiales : fixtures

https://docs.djangoproject.com/en/1.1/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

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