Modifications entre les versions 2 et 4 (s'étendant sur 2 versions)
Version 2 à la date du 2012-08-29 19:47:36
Taille: 9444
Éditeur: DavinBaragiotta
Commentaire:
Version 4 à la date du 2012-08-29 20:01:01
Taille: 6291
Éditeur: DavinBaragiotta
Commentaire:
Texte supprimé. Texte ajouté.
Ligne 2: Ligne 2:
= Django : Architecture d'un projet, Backend et Frontend = = Frontend : interfaces publiques d'un site =
Ligne 29: Ligne 29:
== PARTIE 1 : DÉVELOPPEMENT WEB AVEC DJANGO : ARCHITECTURE D'UN PROJET ==

=== 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)

=== Django ===

Pourquoi django vs autre framework
 * all-in-one
 * admin : meilleur vendeur ;)
 * docs
 * communauté : utilisation répandue

Principaux fichiers
 * models.py
 * admin.py
 * urls.py
 * views.py
 * templates (HTML)

=== Projet : définition du besoin ===

La Direction de l'AUF souhaite pouvoir créer un répertoire des établissements du BMO.

(Ce n'est pas encore vrai pour le BMO mais des projets ananologues sont en cours dans d'autres régions : BECO, BAO, BAP...).

On veut gérer :
 * quels professeurs sont dans quels établissements
 * quelles formations donnent nos établissements membres
 * quels laboratoires de recherche sont dans nos établissements membres

=== Projet : modélisation ===

 * Personne
 * Etablissement
 * Formation
 * Laboratoire
== PARTIE 1 : RAPPELS ==

 * Django
 * Projet carto : définition du besoin
 * Projet carto : modélisation
Ligne 75: Ligne 39:
=== Création du projet ===

Le projet se nomme "Répertoire du BMO".
{{{
django-admin.py startproject bmo_repertoire
cd bmo_repertoire
}}}

 * survol des fichiers générés

{{{
python manage.py runserver
}}}

 * settings.py
  * {{{DATABASES}}}

=== Création d'une application ===

{{{
python manage.py startapp personnes
}}}

 * survol fichiers

 * personnes/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!
  * Personne.nom
  * Etablissement.nom
 {{{
class Etablissement(models.Model):
    nom = models.CharField(max_length=255)

class Personne(models.Model):
    nom = models.CharField(max_length=255)
}}}

 * settings.py
  * {{{INSTALLED_APP}}}
   * 'personnes'

 * création des tables dans DB correspondant à nos modèles
 {{{
python manage.py syncdb
}}}

=== 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'

 * personnes/admin.py
 ''enregistrer modèles voir tutoriel Part 2''
  * https://docs.djangoproject.com/en/1.3/intro/tutorial02/
 {{{
from django.contrib import admin
from personnes.models import *

admin.site.register(Etablissement)
admin.site.register(Personne)
}}}

 * http://127.0.0.1:8000/admin/

 * personnes/models.py
 ''ajouter des attributs (des champs) et des méthodes à nos modèles existants''
  * Personne.prenom
  * Etablissement.sigle
  * {{{def __unicode__(self):}}}

 * delete bmo_repertoire.db
 {{{
rm bmo_repertoire.db
}}}
 * (re)création de la base de DB pour avoir tables avec même structure que nos modèles modifiés
 {{{
python manage.py syncdb
}}}

 * personnes/models.py
 ''ajouter une relation entre nos modèles''
  * Personne.universite

==== Fixtures ====

Prépopuler le projet avec des données...

 * https://docs.djangoproject.com/en/1.3/ref/django-admin/
 
==== South ====

Gestion complète des migrations de données (structure et données de la DB).

 * http://south.aeracode.org/
 * Repartir du projet de l'atelier Backend si fait avant
 * ... sinon coder les modèles

Frontend : interfaces publiques d'un site


INTRODUCTION

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


PARTIE 1 : RAPPELS

  • Django
  • Projet carto : définition du besoin
  • Projet carto : modélisation


PARTIE 2 : HANDS-ON : PROJET ET APPLICATIONS

  • Repartir du projet de l'atelier Backend si fait avant
  • ... sinon coder les modèles

Frontend : présenter les données

  • urls.py

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

    • home
  • 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/

    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))
  • templates

    https://docs.djangoproject.com/en/1.3/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 personnes.models import *
    etablissements = Etablissement.objects.all()
    for e in etablissements: print e
    e = etablissements[0]
    e.personne_set.all()
    f = Personne.objects.get(id=1)
    f.id
    f = Personne.objects.get(id=314)
    e.id
    personnes = Personne.objects.filter(etablissement__nom__contains='Alexandrie')
  • personnes/models.py
    related_name = "personnes"
  • relancer shell
    e.personnes.all()
    e.personnes.count()
  • views.py

    passer les variables pertinentes pour accueil

  • templates/home.html

    boucle for dans template :

    {% for e in etablissements %}
    {% endfor %}

PARTIE 3 : PROJET RÉPERTOIRE BOOSTÉ

Télécharger les sources finales du projet boosté : sources finales sources.tar.gz

  • superuser dans la DB de ces sources :
    • username : giotta
    • password : admin
  • pour créer un autre superuser (le vôtre) :

    python manage.py createsuperuser

Boosté? 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
    MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'media')
    MEDIA_URL = '/media/'
    
    STATIC_ROOT = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'sitestatic')
    STATIC_URL = '/static/'
    
    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 personnes
    • personnes/urls.py
    • personnes/views.py
    • templates/personnes/*

À faire : booster Admin : ModelAdmin

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 FORMATION POUR LE PROJET RÉPERTOIRE

Ajouter modèle Formation

  • Formation
    • nom
    • date_debut
    • date_fin
    • etablissement

Autre exercice : durée d'une Formation

  • Formation.duree()
    """Durée prévue en fonction des dates de début et de fin"""

CONCLUSION : POUR CONTINUER

Ateliers/Django/Frontend/Support (dernière édition le 2012-08-31 16:43:35 par DavinBaragiotta)