= Django : Architecture d'un projet, Backend et Frontend = <> ---- == 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 * 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 ---- == 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 2 : HANDS-ON : PROJET ET APPLICATIONS == === 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/ === 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 [[attachment: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 === * personnes/admin.py * classes EtablissementAdmin, PersonneAdmin ''héritent de ModelAdmin'' * enregistrer Modele avec ModeleAdmin {{{ admin.site.register(Personne, PersonneAdmin) }}} * 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 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 == * 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!