====== Django ======
Django est un framework web sur [[python|Python]] inspiré en partie de Ruby on Rails. Ses Leitmotiv sont:
* Faible couplage
* Aussi peu de code que possible
* Développement rapide
* Ne pas se répéter
* Le très pythonique "L'explicite est mieux que l'implicite"
Source: [[http://docs.djangoproject.com/en/dev/misc/design-philosophies/]]
===== Ressources =====
* [[astuces_django|Astuces]]
* [[http://www.django-fr.org/|django-fr]]
* [[http://www.djangobook.com/en/1.0/|The Django Book]]
===== Django & Ajax =====
* [[http://www.b-list.org/weblog/2006/jul/02/django-and-ajax/|Un article de blog intéressant sur le sujet]]
* [[http://www.dajaxproject.com/|Un projet d'intégration d'Ajax dans Django]]
===== Advocacy =====
* [[http://stackoverflow.com/questions/1293361/how-to-convince-my-boss-to-use-django]]
===== Création d'un projet =====
Source: [[http://docs.django-fr.org/intro/tutorial01.html]]
* S'assurer que Django est bien installé
* Se placer dans le répertoire de son choix et taper:django-admin.py startproject mysite
* Cela crée:
* Un répertoire nommé ''mysite''
* ''%%__init__.py%%'' (package python)
* manage.py (utilitaire CLI de gestion du projet)
* settings.py (configuration)
* urls.py (controleur)
==== Serveur de dev ====
Pour le lancer: python manage.py runserver
# ou:
python manage.py runserver 0.0.0.0:8000
, ilest accessible à l'adesse: [[http://127.0.0.1:8000]]
==== Base de données ====
Editer ''settings.py'':
* ''DATABASE_ENGINE'': 'postgresql_psycopg2', 'mysql' ou 'sqlite3'.
* ''DATABASE_NAME'': obvious!
* ''DATABASE_USER'': obvious!
* ''DATABASE_PASSWORD'': obvious!
* ''DATABASE_HOST'': obvious!
=== SyncDB ===
SyncDB est une option de ''manage.py''; elle permet de s'assurer que la base possède une structure apte à héberger les données de toutes les applications indiquées dans les ''INSTALLED_APPS'' de ''settings.py''. Elle crée donc ce qu'il faut en plus si c'est nécessaire.
python manage.py syncdb
==== Création d'une application ====
Dans le répertoire ''mysite'':python manage.py startapp polls
Cela crée un nouveau répertoire appelé ''polls'' avec dedans:
polls/
__init__.py
models.py
views.py
* ''models.py'' contient le modèle des données (généré par l'ORM via SyncDB).
* ''views.py'' contient les vues.
==== Admin ====
Django comporte une module d'administration pré-installé. Pour l'activer:
* Ajouter ''django.contrib.admin'' dans votre option ''INSTALLED_APPS''.
* Lancer python manage.py syncdb
. Puisque vous avez ajouté une nouvelle application à ''INSTALLED_APPS'', les tables de la base de données ont besoin d’être mises à jour.
* Editer ''urls.py'' en décommentant le pattern adéquat (commençant sans doute par ''(r'^admin'')
* Rendre une appli modifiable par l'admin:from mysite.polls.models import Poll
from django.contrib import admin
admin.site.register(Poll)
dans ''admin.py''
==== Installer django sur un hébergement ====
* [[http://rabaix.net/en/articles/2007/08/31/how-to-install-django-on-ovh-net|Installer Djangi sur un hébergement OVH]]
===== Common Bad Programming Pattern =====
==== Importation croisée ====
Lorsque l'on rencontre l'erreur suivante:
Caught ViewDoesNotExist while rendering: Could not import reporter.reports2.mesure.views. Error was: ...
Et que cette erreur se produit sur n'importe quelle url de l'appli, il y a des chances qu'elle provienne d'une importation croisée: un module importe une ressource provenant d'un second module qui lui-même importe une ressource du premier module. Python n'arrive pas à réaliser le second import.
Cette erreur est d'autant plus perfide que la stack est très obscure et provient en apparence d'un truc qui n'a rien à voir avec le problème (sauf bien sur le module que Python n'arrive pas à importer).