1430
1430
1430
Vous êtes attiré par le développement internet ? Vous ne savez pas comment
créer un site internet ? Vous connaissez Python et aimeriez bien développer vos
sites avec ? Django !
Bonjour à vous, ami zéro.
https://www.sigmaths.net 1/37
Si vous êtes ici par rapport à l'une des questions ci-dessus ou bien par simple
curiosité, je peux vous promettre que vous ne le regretterez pas. Qu'allons-nous
apprendre ? Le développement web dynamique ou bien, en d'autres termes, créer
votre site internet complet.
Qu'est-ce que Django ? A quoi sert-il ? ... Toutes les réponses sont dans ce cours.
Pour bien le comprendre, vous devez au préalable connaître :
Les langages (X)HTML et CSS – un bon tutoriel est présent sur le site
(http://bit.ly/49QLjl)
Ce cours se portera sur la version 1.2 de Django. Si Django est déjà installé sur
votre machine, vérifiez bien la version (cf: Installation de Django)
Le développement web
Kézako ?
Un site web, c'est avant tout des fichiers (HTML, CSS, javascript, ...) qui sont
récupérés puis traités par un navigateur.
Les sites statiques sont des sites internet dont le contenu n'est pas modifié par les
utilisateurs du site. Il faut que le webmestre mette à jour les fichiers hébergés pour
mettre à jour le site. Il n'y a donc aucune interaction possible entre l'utilisateur et le
site.
https://www.sigmaths.net 2/37
Au contraire, les sites dynamiques sont des sites internet dont le contenu est modifié
par les utilisateurs. Le Web 2.0 est l'ensemble des sites dynamiques dont les
utilisateurs ajoutent le contenu. Les webmestres programment uniquement les
logiciels leurs permettant de le faire.
C'est le web communautaire. Le Site du Zéro pour ses parties News, Tutoriels et
Forum, mais aussi Facebook, Twitter et Wikipédia en sont d'autres exemples.
Ne vous prenez pas trop la tête, retenez juste qu'il existe des sites internet statiques et
des sites internet dynamiques.
Le point commun de ces deux types de sites internet c'est que les navigateurs des
utilisateurs comprennent principalement l'HTML, le CSS et le Javascript.
Le HTML est en langage de balisage qui permet de mettre le contenu dans des blocs
(le structurer) et y réaliser une mise en page avec le CSS par la suite.
Le Javascript permet quant à lui d’interagir en temps réel sur la structure de la page
(les balises) et sur le CSS afin de modifier l'affichage en temps réel sans que le
navigateur ne recharge la page. Il permet aussi de faire des actions directement sur le
navigateur de l'utilisateur.
Il existe aussi l'xHTML qui est une standardisation du HTML afin qu'il respecte la
syntaxe définie par la norme XML.
La base de données,
Le code de l'application qui va remplir les pages HTML avec les données de la
base de données
La base de données
Pour réaliser un site internet dynamique, il va falloir stocker les données utilisateurs
dans une base de données.
On va donc réaliser un modèle de données qui va accueillir nos données.
https://www.sigmaths.net 3/37
Lorsque vous parlez de Bases de données n'oubliez pas de mettre un S à
données sans quoi ce n'est plus une base de données ^^
L'Interface Homme-Machine
Le programme
La programmation MVC
Le contrôleur explique comment les données sont récupérées dans les modèles
pour être affichées.
Comment ça marche ?
Le développement web, ce n'est pas automatique, vous devez taper des lignes de
code pour avoir ce que vous souhaitez (ou bien utiliser des codes déjà prêts).
Python n'est pas développé uniquement pour réaliser de programmes web.
Il ne suffit pas d'écrire du Python au milieu d'un fichier HTML comme c'est le cas avec
PHP ou JSP.
Pour connecter notre code Python à un serveur web qui va répondre aux requêtes des
navigateurs, on devrait utiliser la norme CGI qui permet à tout programme de
retourner des pages web.
https://www.sigmaths.net 4/37
#!/usr/bin/python
import MySQLdb
print "</ul>"
print "</body></html>"
connection.close()
Voici un petit schéma simple pour expliquer autrement que par les mots.
Il y a donc un client (le navigateur installé sur votre ordinateur) qui demande une
ressource (fichier) à un serveur.
Dans le cas du listing 1.1, on récupère dans une base de données une liste de livres
triés par date de publication et on génère un fichier HTML qui est ensuite retourné au
navigateur de l'utilisateur.
https://www.sigmaths.net 5/37
Les bases de données
Depuis tout à l'heure, je vous parle de contenu récupérés depuis une base de
données ...
Mais finalement où sont stockées concrètement ces données ? Qu'est-ce qu'une base
de données ? Comment fonctionne-t-elle ?
Une base de données est un ensemble de fichiers qui vont stocker toutes vos
données de façon organisée. Afin de manipuler ces données, il existe un programme
qu'on appelle un SGBD.
Ainsi lorsque notre logiciel souhaite récupérer ou stocker des données de la base, il va
envoyer une requête au SGBD qui va lui retourner les informations demandées.
Les questions de votre sondage ainsi que les réponses de vos membres ...
On voit donc que l'on va créer des relations entre nos données les commentaires de
tel article ...
Une BDD relationnelle est composée de tables et de données. Les tables sont un
ensemble d'information caractérisant un objet. Un utilisateur ou un article par exemple,
ou bien les catégories de votre blog, les news de votre site. La table regroupe la liste
exhaustive de toutes les informations que l'on souhaite conserver à propos d'un objet.
Les données viennent se ranger dans ces les champs de la table pour les conserver
de manière ordonnée (vous imaginiez sérieusement si toutes vos données étaient
rangées en vrac dans une seule grosse boîte ? Elles seraient inutilisable !).
Voici un petit exemple simple d'une table contenant ses propres données (façon BDD)
:
https://www.sigmaths.net 6/37
ID USERNAME INSTRUMENT
1 Cam Batteur
2 Natim Saxophone
3 Cyril Basse
C'est beau de rêver, non ? Bref. En plus clair : nous avons notre table membre qui va
contenir toutes nos données en rapport avec les membres. Ici, Cam , Natim et Cyril
sont les noms d'utilisateurs : ce sont les données d'un champ qu'on peut appeler
username . Batteur , Saxophone et Basse sont les instruments que pratiquent les
trois membres présents dans la base de données. Organisé de telle sorte, Natim ne
peut pas être batteur étant donné qu'il est guitariste, etc.
Le troisième champ est très important dans ce schéma : c'est l'identifiant unique.
Les id permettent de référencer un objet plus facilement. C'est-à-dire qu'ici, Cam a
pour id 1, Natim 2 et Cyril 3. Si nous ne les avions pas, nous ne pourrions pas les
modifier. Imaginons que Cam joue de la Batterie et de la Guitare. Si nous souhaitions
modifier son instrument sans identifiant unique nous ne pourrions pas dire de quelle
fiche nous souhaitons modifier l'instrument.
En gros une table est un tableau dont les colonnes sont définies et chaque ligne
correspond à un objet dont les colonnes sont les caractéristiques.
On peut aussi dire qu'une table définit la structure d'une fiche et qu'on crée une fiche à
chaque fois qu'on parle d'un objet avec les renseignements correspondants sur cette
fiche.
On pourrait très bien imaginer stocker ces tableaux dans des tableurs ou des fichiers
CSV.
Cependant il serait très difficile de faire des recherches dans ces fichiers pour
n'afficher que les guitaristes par exemple.
https://www.sigmaths.net 7/37
Il existe différents types de SGBDR comme MySQL, PostGreSQL, Oracle, MSSQL,
Access, SQLite ...
Ils sont tous compatibles avec Django mais nous allons utiliser principalement MySQL
qui est libre, rapide et simple à utiliser et à configurer.
Django est un framework développé en Python, initialement pour un journal local dans
le Kansas : World Online.
C'est en 2005 que World Online décide d'ouvrir les portes de son framework : Django.
Depuis ce framework a rencontré un franc succès. Il est utilisé par de nombreux
développeurs ayant besoin de développer des sites de grande qualité, très
rapidement.
Pourquoi « Django » ?
Le nom « Django » a été donné en souvenir de Django Reinhardt, guitariste jazz ayant
vécu de 1910 à 1953. Il est considéré comme le meilleur guitariste manouche de tous
les temps.
Cet homme a beaucoup changé notre vision du jazz, et nous ne pouvons que l'en
remercier. :)
https://www.sigmaths.net 8/37
Pour plus d'informations sur Django et ses origines, je vous redirige sur
Image utilisateur la FAQ officielle
(http://docs.djangoproject.com/en/1.2/faq/general/#why-does-this-project-exist) du
projet.
Pourquoi l'utiliser ?
Remarque
Si vous n'arrivez pas vraiment à suivre ce sous-chapitre, ce n'est pas très grave :
imprégnez-vous simplement du vocabulaire qui vous sera expliqué et développé
en temps voulu.
Lorsque l'on réalise un site Internet, on en revient toujours aux même étapes :
réalisation d'un espace utilisateur avec des droits sur l'accès aux données ;
...
Tout cela est relativement répétitif, et si, la première fois, ça peut paraître très
amusant, on en arrive rapidement à faire des copier/coller, assez mauvaise méthode
car source de nombreuses erreurs. Finalement on regroupe des morceaux de code en
fonctions réutilisables.
https://www.sigmaths.net 9/37
À ce moment, on se rapproche de plus en plus de la notion de framework ci-dessus.
L'avantage d'utiliser un framework existant et surtout Open Source tel que Django,
c'est que nous ne sommes pas les seuls à l'utiliser, et que les bugs sont donc corrigés
plus rapidement, les améliorations sont exécutées par plusieurs personnes et de
manière bien mieux réfléchie.
C'est d'ailleurs tout l'intérêt d'utiliser un framework. En faire moins, pour en faire plus
dans le même temps.
Voici une question à laquelle chacun a sa réponse ; d'ailleurs, tout le monde n'utilise
pas Django. Vous êtes complètement libre de votre choix.
Nous sommes nombreux à avoir choisi Django pour plusieurs raisons.
La simplicité d'apprentissage.
La rapidité de développement.
Mais encore ?
https://www.sigmaths.net 10/37
#!/usr/bin/python
import MySQLdb
print "</ul>"
print "</body></html>"
connection.close()
On définit, dans un premier temps, le type de fichier généré, puis on affiche du code
HTML, on récupère ensuite des informations sur des livres contenus dans une base
de données, on ré-affiche du HTML, et on ferme notre connexion à la base de
données.
Pour une page simple comme celle-ci, cette approche aisée peut convenir, mais
lorsque l'application grossit, il devient de plus en plus compliqué de la maintenir.
Voyons comment nous aurions écrit cette page en utilisant Django. Il faut noter que
nous avons séparé notre fichier en trois fichiers Python ( models.py , views.py et
urls.py ) et un gabarit HTML ( derniers_livres.html ).
class Livre(models.Model):
nom = models.CharField(maxlength=50)
date_publication = models.DateField()
https://www.sigmaths.net 11/37
# views.py (la logique métier)
def derniers_livres(request):
liste_livres = Livre.objects.order_by('-date_publication')[:10]
return render_to_response('derniers_livres.html', {'liste_livres': list
e_livres})
urlpatterns = patterns('',
(r'derniers/$', app.views.derniers_livres),
)
<ul>
{% for livre in liste_livres %}
<li>{{ livre.nom }}</li>
{% endfor %}
</ul>
Ce qu'il faut noter ici, c'est la répartition du code selon son objet :
Le fichier models.py décrit la table pour stocker les données sous la forme d'une
classe Python. Cette classe est appelée modèle.
Le fichier urls.py définit quelle vue sera appelée pour un modèle d'URL donné.
Dans notre cas, derniers/ sera traité par la fonction derniers_livres .
https://www.sigmaths.net 12/37
On nommera cette organisation de projet le MTV, proche parent du MVC
(http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-
Contr%C3%B4leur%23Avantages_et_inconv.C3.A9nients).
Téléchargement et installation
Python ;
Debian et dérivés
$ cd ~/Téléchargements/
$ tar zxf Django-1.2.5.tar.gz
$ cd Django-1.2.5
$ sudo python setup.py install
Remarque
À l'heure actuelle, Django n'est pas disponible en version 1.2.5 dans les paquets
Ubuntu. Vous pourrez cependant l'installer via ce biais dès qu'il fera son
apparition sur les dépôts avec $ sudo apt-get install python-django .
Mac OS X
Python et SQLite3 sont déjà présents, vous pouvez utiliser easy_install pour installer
pysqlite2 :
https://www.sigmaths.net 13/37
$ sudo easy_install pysqlite
Pour installer PIL, vous aurez besoin du kit de développement Mac OS X qui se trouve
sur le DVD d'installation dans le répertoire Developer Tools.
PIL ayant besoin de pouvoir lire les fichiers .jpeg, il vous faudra compiler libjpeg
(télécharger la dernière version
(http://sourceforge.net/projects/libjpeg/files/libjpeg/6b/jpegsrc.v6b.tar.gz/download)).
Ensuite, il faut extraire, configurer et compiler :
Puis installer :
$ cd ~/Downloads/
$ tar zxf Django-1.2.5.tar.gz
$ cd Django-1.2.5
$ sudo python setup.py install
Windows
Il existe plusieurs façons d'installer Django sous Windows, mais, à la base, cet OS
n'est pas fait pour ça. Je vais donc vous montrer la méthode la plus simple. Ce n'est
pas aussi évident que sous Unix.
https://www.sigmaths.net 14/37
Vous devez déjà installer Python (http://www.python.org/download/). Téléchargez
ensuite Django 1.2.5 (http://www.djangoproject.com/download/1.2.5/tarball/) et
extrayez-le. Un dossier « Django-1.2.5 » s'est créé.
Une fois ceci effectué, nous allons modifier les variables d'environnement système :
Touche Windows + Pause -> Paramètres système avancés -> Variables d'environnement
Ensuite, cherchez la variable système « Path » et ajoutez ceci en fin de ligne (faites
attention à votre version de Python) :
;C:\Python27;C:\Python27\Lib\site-packages\django\bin
$ cd chemin\vers\django
$ python setup.py install
Ne prenez pas peur, il est normal que toutes ces lignes s'affichent.
Attention
Veillez à ce que tous les fichiers .py s'ouvrent avec Python et non pas un autre
logiciel, sinon vous ne pourrez rien en faire. Dans le cas contraire, il faut à chaque
fois ajouter python devant vos commandes.
Django est maintenant installé. SQLite est par défaut installé avec Python.
Je vous laisse installer PIL (http://effbot.org/media/downloads/PIL-1.1.7.win32-
py2.7.exe) par vous-mêmes.
Vérification
Pour vérifier l'installation, vous pouvez lancer une console Python et tester :
https://www.sigmaths.net 15/37
>>> import django
>>> print django.VERSION
(1, 2, 5, 'final', 0)
Ce tuto étant destiné à Django 1.2, vérifiez que vous possédez bien une version 1.2
de Django. Sinon, les numéros de version peuvent être différents, le tout est de ne pas
avoir d'erreur.
Vous êtes fin prêts pour créer votre premier projet !
Maintenant que vous avez tout installé, vous souhaitez sûrement commencer votre
premier projet. Alors, allons-y !
Ouvrez votre terminal préféré et dirigez-vous vers votre répertoire de travail avec
cd .
L'architecture du projet
Rien de bien compliqué ici ; la seule chose à connaître est le nom du projet. Nous
allons l'appeler « tuto_sdz », mais vous pouvez bien sûr changer.
Voici la ligne de commande permettant de créer notre projet :
Les noms de vos projets ne doivent être composé que de lettres, chiffres et
underscores. De plus, vous ne devez pas nommer votre projet comme l'un des
dossiers présents dans le dossier d'exécution du fichier django-admin.py .
ls tuto_sdz/
__init__.py manage.py settings.py urls.py
https://www.sigmaths.net 16/37
__init__.py : Il s'agit d'un fichier juste qui définit le répertoire comme étant un
module Python. Tous vos répertoires contenant du code Python que vous souhaitez
charger depuis d'autres fichiers Python, doivent contenir ce fichier même s'il est
vide.
manage.py : Ce fichier nous permet de faire des actions définies sur notre projet
Django. Nous verrons son fonctionnement ci-dessous.
urls.py : Ce fichier est, comme son nom l'indique, destiné à recevoir les modèles
d'URL que nous définirons. Vous pouvez y jeter un coup d'œil, mais les lignes y
sont pour le moment commentées et nous l'étudierons plus en détail dans un
instant.
https://www.sigmaths.net 17/37
python manage.py help
Usage: manage.py subcommand [options] [args]
Options:
-v VERBOSITY, --verbosity=VERBOSITY
Verbosity level; 0=minimal output, 1=normal output,
2=all output
--settings=SETTINGS The Python path to a settings module, e.g.
"myproject.settings.main". If this isn't provide
d, the
DJANGO_SETTINGS_MODULE environment variable will be
used.
--pythonpath=PYTHONPATH
A directory to add to the Python path, e.g.
"/home/djangoprojects/myproject".
--traceback Print traceback on exception
--version show program's version number and exit
-h, --help show this help message and exit
Available subcommands:
changepassword
cleanup
compilemessages
createcachetable
createsuperuser
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
reset
runfcgi
runserver
shell
sql
sqlall
sqlclear
https://www.sigmaths.net 18/37
sqlcustom
sqlflush
sqlindexes
sqlinitialdata
sqlreset
sqlsequencereset
startapp
syncdb
test
testserver
validate
Can be run as a cronjob or directly to clean out old data from the databas
e (only expired sessions at the moment).
[...]
On verra par la suite qu'on peut également ajouter nous-mêmes nos commandes à
manage.py , ou bien que des modules externes le font pour nous.
https://www.sigmaths.net 19/37
Notez que, sans argument, le serveur se lance en mode de développement et
n'est accessible, par sécurité, que sur la boucle locale (IP 127.0.0.1). En aucun
cas, vous ne devez utiliser ce serveur en production. Nous verrons plus loin
comment faire pour configurer Django en production.
Si vous souhaitez changer le port du serveur (pour lancer plusieurs projets Django,
par exemple), vous pouvez faire comme ceci :
Les paramètres
À vous qui, comme tout programmeur étranger, placez des accents partout, il y a
deux règles en Python 2.* que je souhaite vous rappeler.
Codez en utf-8 en mettant # -*- coding: utf-8 -*- au début de tous vos
fichiers.
Si vous utilisez les chaînes de caractères, mettez-les en Unicode comme cela :
chaine = u'Je suis un chaîne de caractères' .
Si vous respectez ces deux règles, vous ne devriez pas avoir de problèmes
d'encodage dans vos codes.
https://www.sigmaths.net 20/37
# -*- coding: utf-8 -*-
# Django settings for tuto_sdz project.
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
(u'Cyril Mizzi', '[email protected]'),
(u'Natim', '[email protected]'),
(u'Cam', '[email protected]')
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg
2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'tuto_sdz.db', # Or path to database f
ile if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhos
t. Not used with sqlite3.
'PORT': '', # Set to empty string for default.
Not used with sqlite3.
}
}
SITE_ID = 1
https://www.sigmaths.net 21/37
# Votre projet est-il prévu pour être multilingue ? Sous Django,
# il vaut mieux coder systématiquement pour le multilingue.
# Cela ne coûte pas grand-chose et simplifie la vie par la suite.
USE_I18N = True
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = '/medias/'
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to us
e a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/admin-media/'
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
ROOT_URLCONF = 'tuto_sdz.urls'
TEMPLATE_DIRS = (
https://www.sigmaths.net 22/37
# Dossiers des templates comme: "/home/html/django_templates" ou "C:/ww
w/django/templates".
# Utilisez des slashs même sous Windows.
# Attention de bien utiliser un chemin ABSOLU
'/home/natim/projets-django/tuto_sdz/templates'
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
)
l'un, medias, pour les fichiers statiques de notre design : css, images,...
Si vous ne savez pas ce que sont les templates, nous le verrons très bientôt, pas
d'inquiétude.
Attention
Je le répète, ce fichier est confidentiel, veillez à ne pas le distribuer avec vos
sources.
Généralement, nous faisons une copie settings.py.example qui, elle, est livrée à
titre d'exemple avec le projet, et dont on supprime les informations confidentielles.
De plus, cela évite d'écraser le fichier settings.py spécifique d'une installation lors
de la mise à jour du projet.
https://www.sigmaths.net 23/37
from random import choice
print ''.join([choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=
+)') for i in range(50)])
Vous avez ainsi un salt tout neuf pour votre site en production, par exemple.
Maintenant que nous avons conçu notre projet Web avec Django, il est temps de créer
notre première application. Ce qu'il faut savoir, c'est qu'un projet peut contenir une ou
plusieurs applications. Cela vous permettra de bien séparer les parties distinctes de
votre site : forums, tutoriels, messagerie privée, membres, etc.
Les applications Django ont un avantage important : elles sont portables. Cela signifie
concrètement que si vous développez une application « livre d'or » pour un projet « x
», elle pourra être utilisée sur un projet « y ». Cette portabilité permet notamment
d'utiliser des applications toutes faites dans vos projets, sans forcément réécrire
quelque chose qui a déjà été fait. Par exemple, une application peut simplifier
l'inscription / connexion ; nous aurons l'occasion d'en tester quelques-unes plus loin
dans le cours.
Toujours à l'aide du fichier manage.py , nous allons créer notre première application.
Pour ce faire, vous allez devoir taper la commande ci-dessous à la racine de votre
projet :
https://www.sigmaths.net 24/37
Le fonctionnement est strictement le même que la commande startproject (qui
nous a permis de créer notre premier projet) : le dernier argument est le nom de votre
application.
Je vous conseille de choisir un nom d'application au pluriel, vous verrez pourquoi dans
les prochains chapitres. C'est une sorte de convention lorsque l'on utilise un
framework web comme Django.
Si tout s'est bien déroulé, vous devriez voir un dossier « sondages » à la racine de
votre projet. En ouvrant ce dossier fraîchement créé, vous devriez trouver les fichiers
suivants :
models.py : comme son nom l'indique, il s'agit des modèles de notre application.
Cela nous permettra plus tard de générer notamment notre base de données ;
views.py : encore une fois, le nom est explicite. Ce fichier correspond à nos vues,
autrement dit, toutes les pages visibles de votre application ;
tests.py : ce fichier vous permettra de faire subir une batterie de tests à votre
application. On aura l'occasion d'aborder ce sujet une fois que vous aurez acquis
les bases.
Passons maintenant aux choses sérieuses : les modèles de votre application. Ils vous
permettront de générer la base de données de votre projet, avec toutes les tables et
champs nécessaires. Dans le cas de notre script de sondage, nous avons besoin de
deux modèles : un pour les sondages et un autre pour les réponses des sondages.
Ouvrons le fichier models.py de notre application pour y voir plus clair ! :)
https://www.sigmaths.net 25/37
Pour ajouter un modèle, rien de plus simple : il suffit d'insérer une class du nom du
modèle, et cette dernière doit hériter de la class models.Model . Si vous connaissez ne
serait-ce qu'un peu la POO en Python, vous devriez y arriver.
class Sondage(models.Model):
pass
class Reponse(models.Model):
pass
Maintenant que notre premier modèle est déclaré, il va falloir le remplir. Chaque
modèle est constitué de champs et de fonctions. Les champs sont évidemment la
base des modèles, alors que les fonctions permettent de gagner du temps en évitant
de réécrire plusieurs fois le même code.
class Sondage(models.Model):
question = models.CharField(max_length=200)
date_publication = models.DateTimeField()
class Reponse(models.Model):
sondage = models.ForeignKey(Sondage)
choix = models.CharField(max_length=200)
nb_votes = models.IntegerField()
Nous venons de déclarer dans nos deux classes les champs des modèles. Chaque
champ a un nom, un type et d'éventuelles options. Les types de champs CharField et
IntegerField correspondent respectivement à un champ de texte et à un champ
entier.
ForeignKey , lui, est une relation avec un modèle (c'est lui qui va faire la relation entre
le modèle « Sondage » et « Reponse »). Mais ne nous éternisons pas là-dessus, nous
aborderons la liste complète des champs et relations supportés par Django au début
de la deuxième partie.
Bien que l'on ait créé notre application, elle n'est pas reliée à notre projet. Pour la
joindre, il faut modifier le fichier de configuration settings.py — contenant
notamment les informations relatives à votre base de données.
Ouvrez ce fichier, rendez-vous tout en bas, et vous devriez apercevoir un tuple intitulé
INSTALLED_APPS . Il s'agit tout bonnement des applications installées. Il y a toujours
celles de Django par défaut : gestion des utilisateurs, sessions, utilisateurs, etc.
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'tuto_sdz.sondages',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
)
Si vous avez bien suivi les étapes jusqu'ici, vous allez pouvoir afficher la structure
SQL. Cela va permettre de vérifier si l'application « sondages » a bien été prise en
compte et de voir le code SQL généré pour nos modèles.
https://www.sigmaths.net 27/37
$ python manage.py sql sondages
BEGIN;
CREATE TABLE "sondages_sondage" (
"id" integer NOT NULL PRIMARY KEY,
"question" varchar(200) NOT NULL,
"date_publication" datetime NOT NULL
)
;
CREATE TABLE "sondages_reponse" (
"id" integer NOT NULL PRIMARY KEY,
"sondage_id" integer NOT NULL REFERENCES "sondages_sondage" ("id"),
"choix" varchar(200) NOT NULL,
"nb_votes" integer NOT NULL
)
;
COMMIT;
Tout est correct ? On va donc générer la base de données de notre application. Pour
cela, je vais (à nouveau) utiliser le fichier manage.py :
https://www.sigmaths.net 28/37
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table sondages_sondage
Creating table sondages_reponse
You just installed Django's auth system, which means you don't have any sup
erusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'camille'): Cam
E-mail address: [email protected]
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Group_permissions model
Installing index for auth.User_user_permissions model
Installing index for auth.User_groups model
Installing index for auth.Message model
Installing index for sondages.Reponse model
No fixtures found.
Pour le moment, nous n'avons fait que prédéfinir les paramètres et données de
notre application de sondages. Maintenant, que celle-ci a été initiée, nous allons
traiter la partie traitement de notre application. Nous allons établir une relation
entre le client et le serveur de façon très simple.
Une vue, sous Django, c'est une fonction en somme. Cette fonction est en fait la
relation entre le modèle et le template (que nous verrons juste après). Cette fonction
permet, par exemple, de retourner le nombre de sondages de notre base de données
dans notre gabarit (= template).
Prenons un exemple concret sur son fonctionnement. Nous avons notre application de
sondages. Nous avons les sondages qui sont affichés dans nos gabarits, et tout, et
tout. Nous souhaitons maintenant que l'utilisateur puisse voter dans son sondage
favori.
Nous allons faire quelque chose de très simple : dans notre vue, nous récupérons
notre sondage en question (il y a donc la relation entre le modèle et la vue). Ensuite,
nous transmettons les données récupérées dans notre gabarit pour l'afficher (relation
vue et template). Et dans le sens inverse, ça fonctionne aussi. L'utilisateur valide son
choix, le choix va donc aller à la vue, qui va dire au modèle d'ajouter un vote, et le
modèle va envoyer la requête à la base de données. J'espère que vous arrivez à
comprendre.
Chaque module possède ses propres vues comme par exemples, l'accueil des
sondages, un sondage en particulier, l'ajout d'un vote, la suppression d'un sondage...
Toutes ces vues se déclarent dans le fichier views.py . Rendez-vous donc dans le
dossier tuto_sdz/sondages$ et ouvrez le fichier en question.
Nous allons déjà, comme à notre habitude, ajouter l'encodage de notre fichier et, nous
allons déclarer notre première fonction (notre première vue) :
https://www.sigmaths.net 30/37
#-*- coding: utf-8 -*-
def homepage(request):
return True
Information à savoir
La fonction doit toujours avoir comme argument premier request , c'est
obligatoire. Ce sont toutes les données envoyées à la vue.
Une fonction doit aussi toujours retourner quelque chose. Dans notre cas, nous
allons lui retourner True . Si votre fonction ne retourne rien, vous allez vous
retrouver avec une belle erreur Django.
Nous n'allons pas de suite voir comment afficher des informations car nous devons
d'abord voir les URLs. Cela étant, nous pouvons toujours apprendre à gérer le
contenu de nos vues.
Comme je vous l'ai dit, il faut toujours qu'une définition de vue retourne quelque
chose. Faites-donc très attention si vous devez utiliser des conditions : il faut que
chaque possibilité retourne une valeur, des variables ou des objets.
Citation
Mais, mais, mais... c'est quoi un objet ?
Un objet, c'est un retour de données récupéré du modèle. En gros, lorsque vous allez
faire une requête pour récupérer les derniers sondages, le retour de cette requête
sera ce qu'on appelle : un objet. Bah tiens, pourquoi ne pas effectuer une petite
requête pour récupérer tous les sondages présents ?
Comment ça marche tout ça ? En Python, vous devez savoir qu'il faut importer des
données pour pouvoir les utiliser dans notre fichier. Dans notre cas, étant donné que
nous souhaitons récupérer les données de nos deux modèles (le sondage, et ses
réponses), il faut le préciser comme ceci :
Ces bouts de codes sont très simple : dans notre application et les modèles liés, nous
importons dans notre fichier courant les deux modèles créés (on peut aussi faire
from sondages.models import * , mais c'est moins pratique).
Dans notre fonction, nous souhaitons récupérer tous les sondages. Nous devons donc
faire une requête Django :
def homepage(request):
list_sondages = Sondage.objects.all()
return True
Ne prenez pas peur de suite, c'est très simple : dans notre variable list_sondages ,
nous allons retourner des objets (voilà, ce sont nos fameux objets). Ca marche très
simplement.
En français, ça veut dire : dans le modèle Sondages, retourne moi tous les objets.
Pour le moment, rien ne va s'afficher, normalement, nous n'avons rien configuré au
niveau des templates. De plus, rien ne s'affiche car nous ne retournons qu'une valeur
booléenne. Si vous cherchez à retourner la variable et que vous affichez le tout, vous
allez vous retrouver avec un retour Django et non pas des affichages comme on le
voudrait.
Héhé. Maintenant que nous avons toutes nos données, il va falloir retourner ces
informations à notre gabarit (normal quoi). Pour faire simple, il existe diverses
solutions pour se faire. Nous allons étudier la plus simple (et la plus courte :D )
maintenant, et nous verrons les autres plus tard.
La fonction que nous allons utiliser permet de sélectionner un fichier gabarit et lui
envoyer des variables. Elle doit obligatoirement être utilisée dans un retour. Il faut
importer cette fonction comme cela :
render_to_response(template_name, list_variables)
https://www.sigmaths.net 32/37
Pour nous, cela va se faire très simplement :
def homepage(request):
list_sondages = Sondage.objects.all()
En gros, cela dit d'utiliser le gabarit se trouvant dans le dossier templates - définit
dans le fichier de configuration du projet (TEMPLATE_DIRS) - le fichier
homepage.html qui se trouve dans le sous-dossier sondages , soit, dans notre cas :
/home/natim/projets-django/tuto_sdz/templates/sondages/homepage.html .
def homepage(request):
list_sondages = Sondage.objects.all()
Le gestionnaire d'URLs
Les URLs sont très importantes dans votre projet. C'est à vous de les faire de toute
pièce. Concrètement, elles ne sont pas compliquées à manipuler mais il faut connaître
leur fonctionnement.
Si vous ouvrez le fichier urls.py , vous allez avoir quelques exemples du
fonctionnement de vos URLs. En réalité, ce que nous allons faire sera quelque peu
différents : nous allons utiliser les expressions régulières et manipuler les vues.
Pour faire simple : une vue est reliée à une ou plusieurs URLs, mais une URL ne peut
pas être reliée à plusieurs vue.
https://www.sigmaths.net 33/37
from django.conf.urls.defaults import *
urlpatterns = patterns('',
# Example:
# (r'^tuto_sdz/', include('tuto_sdz.foo.urls')),
Nous verrons plus tard à quoi corresponde la plupart des lignes commentées (elles
sont en rapport avec l'administration). Pour l'instant, nous allons simplement nous
occuper de la variable urlpatterns .
urlpatterns = patterns('', )
Cette variable va devoir contenir toutes nos URLs. Nous verrons plus en détails plus
tard que nous pouvons découper la variable ainsi que la mettre dans différents fichiers
mais nous allons rester primaire pour le début. Si vous connaissez vos expressions
régulières, vous devriez comprendre ceci (ou partiellement) :
urlpatterns = patterns('',
(r'^sondages/$', 'sondages.views.homepage')
)
La premier chaîne de caractères est notre URL sous forme d'expression régulière. La
deuxième, le module et la vue sur lesquels nous souhaitons pointer l'URL.
Sérieusement, vous trouvez ça compliqué ? o_O
Chaque ligne correspond à une nouvelle URL. Chaque URL pointe vers une seule vue
définie comme ci-dessus. Simple comme « Bonjour » !
Créer un dossier sondages dans votre dossier de templates et, à l'intérieur, définissez
le fichier homepage.html .
Le système de tags
Comme dans tout moteur de templates, vous avez différents tags qui permettent
d'avoir des conditions, des définitions, et le plus important : afficher le contenu de
variables. Pour afficher justement le contenu d'une variable, vous devez utiliser
{{ var }} .
Dans notre exemple, si vous insérez {{ page_title }} , vous verrez d'affiché : «
Accueil des sondages » sur cette url : http://127.0.0.1:8000/sondages
(http://127.0.0.1:8000/sondages).
Bonjour
{% endif %}.
https://www.sigmaths.net 35/37
Voici les deux tags que nous utiliserons le plus et que vous devez impérativement
savoir.
{{ content.name }}
{{ content.lastname }}
{{ content.age }}
{% empty %}
Aucun utilisateur n'est référencé.
{% endfor %}
Les filtres
Nous en parlons maintenant mais ils ne vous serviront pas tant que ça. Sachez
simplement qu'un filtre est un attribut qu'on peut ajouter sur une variable pour lui
ajouter des effets comme tronquer le contenu à 100 mots, ou bien écrire le tout en
majuscule, en minuscule... Bref, il y a de quoi faire. Vous les découvrirez tout au long
de ce cours.
La suite
En attendant une suite à ce cours, nous pouvons vous suggérer certaines lectures
cursives :
Sur Django
Attention
Lorsque vous lisez un tutoriel sur Django, assurez-vous qu'il s'agisse bien de la
version de Django que vous utilisez.
https://www.sigmaths.net 36/37
Image utilisateurImage utilisateur
Django Project - La documentation officielle (http://docs.djangoproject.com/)
Image utilisateurImage utilisateur
Le Django Book. (http://www.djangobook.com/en/2.0/)
Image utilisateurImage utilisateur
Django-fr - Le site de la Communauté francophone (http://www.django-fr.org/)
Image utilisateurImage utilisateur
Version française du Django Book (http://djangobook.zindep.com/1.0/)
Sur Python
(X)HTML
https://www.sigmaths.net 37/37