Taille: 8249
Commentaire: ajout et reformattage (de redmine Montréal-Python) des premières parties : admin
|
← Version 17 à la date du 2012-02-26 10:19:03 ⇥
Taille: 9393
Commentaire:
|
Texte supprimé. | Texte ajouté. |
Ligne 1: | Ligne 1: |
= Django : Architecture d'un projet, Backend (admin) et Frontend (interfaces publiques d'un site) = | = Django : Architecture d'un projet, Backend et Frontend = |
Ligne 18: | Ligne 18: |
* 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_ |
* 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'' |
Ligne 54: | Ligne 54: |
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. |
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 |
Ligne 60: | Ligne 65: |
* Joueur * Equipe * Match |
* Personne * Etablissement * Formation * Laboratoire |
Ligne 70: | Ligne 76: |
Le projet se nomme "Répertoire du BMO". | |
Ligne 71: | Ligne 78: |
django-admin.py startproject liguemp cd liguemp |
django-admin.py startproject bmo_repertoire cd bmo_repertoire |
Ligne 82: | Ligne 89: |
* DATABASE_* | * {{{DATABASES}}} |
Ligne 87: | Ligne 94: |
python manage.py startapp recrutement | python manage.py startapp personnes |
Ligne 92: | Ligne 99: |
* recrutement/models.py | * personnes/models.py |
Ligne 94: | Ligne 101: |
https://docs.djangoproject.com/en/1.3/topics/db/models/ https://docs.djangoproject.com/en/1.3/ref/models/fields/ |
* https://docs.djangoproject.com/en/1.3/topics/db/models/ * https://docs.djangoproject.com/en/1.3/ref/models/fields/ |
Ligne 97: | Ligne 104: |
* Joueur.nom * Equipe.nom |
* Personne.nom * Etablissement.nom {{{ class Etablissement(models.Model): nom = models.CharField(max_length=255) class Personne(models.Model): nom = models.CharField(max_length=255) }}} |
Ligne 101: | Ligne 115: |
* INSTALLED_APP * 'recrutement' {{{ |
* {{{INSTALLED_APP}}} * 'personnes' * création des tables dans DB correspondant à nos modèles {{{ |
Ligne 119: | Ligne 134: |
* INSTALLED_APP | * {{{INSTALLED_APP}}} |
Ligne 122: | Ligne 137: |
* recrutement/admin.py ''enregistrer modèles voir tutoriel Part 2'' https://docs.djangoproject.com/en/1.3/intro/tutorial02/ |
* 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) }}} |
Ligne 129: | Ligne 150: |
* recrutement/models.py {{{def __unicode__(self):}}} * Joueur.prenom * delete liguemp.db {{{ |
* 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 {{{ |
Ligne 139: | Ligne 165: |
fixtures https://docs.djangoproject.com/en/1.3/ref/django-admin/ |
* 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/ |
Ligne 142: | Ligne 175: |
south http://south.aeracode.org/ * recrutement/models.py * Joueur.equipe ---- == PARTIE 3 : HANDS-ON : PROJET ET APPLICATIONS == === Repartir des sources initiales === Repartir du projet créé lors de l'atelier du 2011-12-07 : sources initiales [[attachment:sources.tar.gz]] 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 |
==== South ==== Gestion complète des migrations de données (structure et données de la DB). * http://south.aeracode.org/ |
Ligne 165: | Ligne 184: |
https://docs.djangoproject.com/en/1.1/topics/http/urls/ | https://docs.djangoproject.com/en/1.3/topics/http/urls/ |
Ligne 169: | Ligne 188: |
https://docs.djangoproject.com/en/1.1/topics/http/views/ | https://docs.djangoproject.com/en/1.3/topics/http/views/ |
Ligne 173: | Ligne 192: |
https://docs.djangoproject.com/en/1.1/intro/tutorial03/ | 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)) }}} |
Ligne 176: | Ligne 202: |
https://docs.djangoproject.com/en/1.1/topics/templates/ | https://docs.djangoproject.com/en/1.3/topics/templates/ |
Ligne 210: | Ligne 236: |
from etablissements.models import * | from personnes.models import * |
Ligne 214: | Ligne 240: |
e.formation_set.all() f = Formation.objects.get(id=1) |
e.personne_set.all() f = Personne.objects.get(id=1) |
Ligne 217: | Ligne 243: |
f = Formation.objects.get(id=314) | f = Personne.objects.get(id=314) |
Ligne 219: | Ligne 245: |
formations = Formation.objects.filter(etablissement__nom__contains='Hanoi') }}} * etablissements/models.py {{{ related_name = "formations" |
personnes = Personne.objects.filter(etablissement__nom__contains='Alexandrie') }}} * personnes/models.py {{{ related_name = "personnes" |
Ligne 229: | Ligne 255: |
e.formations.all() e.formations.count() |
e.personnes.all() e.personnes.count() |
Ligne 243: | Ligne 269: |
== PARTIE 4 : PROJET CARTO PIMPÉ == Télécharger les sources finales du projet pimpé : sources finales [[attachment:sources.tar.gz]] Pimpé? Quoi de neuf? |
== 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? |
Ligne 264: | Ligne 297: |
https://docs.djangoproject.com/en/1.1/howto/static-files/ | https://docs.djangoproject.com/en/1.3/howto/static-files/ |
Ligne 274: | Ligne 307: |
MEDIA_URL = '/static/' | 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"), ) |
Ligne 279: | Ligne 319: |
from django.conf import settings if settings.DEBUG: urlpatterns += patterns('', (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), ) |
from django.contrib.staticfiles.urls import staticfiles_urlpatterns urlpatterns += staticfiles_urlpatterns() |
Ligne 305: | Ligne 342: |
* urls.py : import des urls de l'app etablissements * etablissements/urls.py * etablissements/views.py * templates/etablissements/* === Admin pimpé : ModelAdmin === * etablissements/admin.py * classes EtablissementAdmin, FormationAdmin |
* 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 |
Ligne 320: | Ligne 357: |
admin.site.register(Formation, FormationAdmin) | admin.site.register(Personne, PersonneAdmin) |
Ligne 328: | Ligne 365: |
* plus? https://docs.djangoproject.com/en/1.1/ref/contrib/admin/ | * plus? https://docs.djangoproject.com/en/1.3/ref/contrib/admin/ |
Ligne 334: | Ligne 371: |
https://docs.djangoproject.com/en/1.1/ref/django-admin/ | https://docs.djangoproject.com/en/1.3/ref/django-admin/ |
Ligne 350: | Ligne 387: |
== PARTIE 5 : HANDS-ON : CRÉER L'APPLICATION PROJET POUR LE PROJET CARTO == === Ajouter modèle Projet === * Projet |
== PARTIE 4 : HANDS-ON : CRÉER L'APPLICATION FORMATION POUR LE PROJET RÉPERTOIRE == === Ajouter modèle Formation === * Formation |
Ligne 358: | Ligne 395: |
* etablissements === Autre exercice : durée d'un Projet et avancement d'un Projet === * Projet.duree() |
* etablissement === Autre exercice : durée d'une Formation === * Formation.duree() |
Ligne 365: | Ligne 402: |
}}} * Projet.avancement() {{{ """Durée réelle à partir de la date de début jusqu'à maintenant.""" |
Django : Architecture d'un projet, Backend et Frontend
Sommaire
- 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
- doc : bonne version de django
- 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 :
- 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/
- settings.py
INSTALLED_APP
- 'django.contrib.admin'
- personnes/admin.py
enregistrer modèles voir tutoriel Part 2
from django.contrib import admin from personnes.models import * admin.site.register(Etablissement) admin.site.register(Personne)
- 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...
South
Gestion complète des migrations de données (structure et données de la DB).
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
- 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 :
- Channel IRC #django :
- Contribs, plugins
https://docs.djangoproject.com/en/dev/ref/contrib/
- south
- reversion
- Autre : pypi
- Enjoy!