Résumé

Django, framework Python MVC réputé pour son élégance et sa puissance, permet de développer des applications web de qualité professionnelle extrêmement riches et dynamiques en un temps record – pour peu que le développeur fasse l’effort de conception nécessaire et tire parti de son modèle de développement et de son écosystème.

Gagnez en expertise sur le framework de développement web le plus ambitieux !

Au fil de deux études de cas (un tracker et un agenda partagé) menées de bout en bout, cet ouvrage expose les fondamentaux de Django que sont les les vues, les templates, les formulaires et les modèles. Par sa présentation détaillée de l’architecture et des fonctionnalités de Django, cet ouvrage permet au développeur, aguerri comme débutant, d’atteindre une connaissance intime du framework.

Riche en exemples concrets et en astuces utiles, l’ouvrage distille également de nombreuses bonnes pratiques issues de l’expérience professionnelle de l’auteur. Il constitue pour le développeur Django le complément avancé indispensable à la documentation existante.

Au sommaire

Bien démarrer avec Django • Installer l’environnement de travail • Initialiser un projet • Créer sa première application Django 1.5 • Un tracker • Méthode et framework • Mise en place du projet • Settings et configuration de la base de données (syncdb) et des applications • URL, application dynamique, objet ticket • Interfaces d’administration et client • Des bases à la production • Créer un agenda partagé • Organisation du projet : modèles et tables • Migrations • Gestion de l’authentification • Template login • Formulaire • Tests unitaires • Création d’un événement • ModelForm • Contraintes • Formulaire intelligent • Interface CRUD • Templates pour l’affichage • Intégration avec CSS et JavaScript • Organisation • Inclure un framework CSS • Vues génériques pour les fonctions d’agenda • Collection d’événements • Pagination • Détails d’un événement • Revue de l’application et factorisation du code • Vue Evenement_Detail : factorisation du formulaire et URL DRY • Créer, modifier, supprimer des événements • Partage • Gérer la liste d’utilisateurs connectés : modèles, invitations, vues • Relier les applications Calendrier et Agenda : gestion des participants et des statuts • Bases de données • Choisir sa base de données • Django et le NoSQL • ORM • Types de champs • Relations • Héritages • Méthodes des modèles • Querysets • Managers • Objet Q • Traitement de l’information : les vues • Workflow, middlewares, objets request et response, compilation du template, les context processors • Vues génériques • Vues classes vs vues fonctions • Affichage de l’information : les templates • Langage • Bonnes pratiques d’organisation • Tags et filtres • Dialogue avec l’utilisateur : les formulaires • Objet Form • Options des champs • Django et le protocole web • GET, POST et REST • Mise en place d’une API REST complète • Contribs • Sécurisation OAuth • Modules admin, content-types, sitemaps, syndication… • Django avancé • Surclasser l’application admin • Vues : générer modèles et URL à la volée • Utiliser Django en dehors de Django.

À qui s’adresse ce livre ?

– À tous les développeurs web (PHP, Java, Python, etc.) qui souhaitent recourir à un framework puissant pour des applications professionnelles ;

– Aux développeurs Django souhaitant aller plus loin dans leur maîtrise du framework.

Biographie auteur

Yohann Gabory est développeur web au sein d’Outscale et spécialiste de solutions Python/Django. Développeur Python depuis 7 ans, il a pratiqué d’autres framework tels que Ruby on Rails et Turbogears et a à son actif des références prestigieuses, telles que Libération et l’AFDAS.
Il participe à des conférences Django et fut par ailleurs spécialisé en réseaux sociaux chez PilotSystems : protocole d’authentification Oauth, gestion d’identité OpenID, intégration Facebook, Twitter, Google Market Place…
Il est aujourd’hui en charge du développement des interfaces de gestion du cloud Outscale.

Avec la contribution de Thomas Petillon

www.editions-eyrolles.com

Django

avancé

Pour des applications web
puissantes en Python

Yohann Gabory

Préface de Nicolas Ferrari
Avec la contribution de Thomas Petillon

ÉDITIONS EYROLLES

61, bd Saint-Germain

75240 Paris Cedex 05

www.editions-eyrolles.com

Remerciements à Thomas Petillon et Anne Bougnoux pour leurs contributions précieuses.

En application de la loi du 11 mars 1957, il est interdit de reproduire intégralement ou partiellement le présent ouvrage, sur quelque support que ce soit, sans l’autorisation de l’Éditeur ou du Centre Français d’exploitation du droit de copie, 20, rue des Grands Augustins, 75006 Paris.

© Groupe Eyrolles, 2013, ISBN : 978-2-212-13415-5

CHEZ LE MÊME ÉDITEUR

Développement web et mobile

R. RIMELÉ. – HTML5.

N° 13638, 2e édition, 2013, 752 pages.

F. DRAILLARD. – Premiers pas en CSS3 et HTML5.

N° 13689, 2013, 472 pages.

R. GOETTER. – CSS avancées.

N° 13405, 2e édition, 2010, 385 pages.

R. GOETTER. – CSS 2 : pratique du design web.

N° 12461, 3e édition, 2009, 340 pages.

R. RIMELÉ. – Mémento HTML5.

N° 13420, 2012, 14 pages.

R. GOETTER. – Mémento CSS 3.

N° 13665, 2e édition, 2013, 14 pages.

É. DASPET et C. PIERRE DE GEYER. – PHP 5 avancé.

N° 13435, 6e édition, 2012, 870 pages.

Design web et ergonomie

A. BOUCHER. – Ergonomie web.

N° 13215, 3e édition, 2011, 356 pages.

A. BOUCHER. – Ergonomie web illustrée.

N° 12695, 2010, 336 pages.

A. BOUCHER. – Mémento Ergonomie web.

N° 13735, 3e édition, 2013, 14 pages.

E. SLOÏM. – Mémento Sites web.

N° 12802, 3e édition, 2010, 14 pages.

O. ANDRIEU. – Réussir son référencement Web.

N° 13664, 2013, 552 pages.

F. MATTATIA. – Traitement des données personnelles.

N° 13594, 2013, 188 pages.

Autres ouvrages

F. MATTATIA. – Traitement des données personnelles.

N° 13594, 2013, 188 pages.

C. PORTENEUVE. – Bien développer pour le Web 2.0.

N° 12391, 2e édition, 2008, 674 pages.

F. DAOUST, D. HAZAËL-MASSIEUX. – Bonnes pratiques pour le Web mobile.

N° 12828, 2011, 300 pages.

T. BAILLET. – Créer son thème WordPress mobile.

N° 13441, 2012, 128 pages.

É. SARRION. – XHTML/CSS et JavaScript pour le web mobile.

N° 12775, 2010, 274 pages.

É. SARRION. – jQuery Mobile.

N° 13388, 2012, 601 pages.

P. Y. CHATELIER. – Objective-C pour le développeur avancé.

N° 13686, 2e édition, 2013, 242 pages.

K. MCGRANE. – Stratégie de contenu mobile.

N° 13675, 2013, 172 pages.

C. SCHILLINGER. – Intégration web : Les bonnes pratiques.

N° 13370, 2012, 390 pages.

I. C...

Préface

En quinze ans, les techniques de développement web ont beaucoup évolué. J’ai fait mes premiers pas sur Internet au milieu des années 1990 – après la récente introduction de PHP en 1994. Tout était prétexte à la création d’un site, à la fois pour nourrir la curiosité du développeur, mais aussi pour jouir d’une présence en ligne aux yeux de tous, et par delà les frontières. C’était une période de découvertes : on faisait tout au sein d’un même script, qu’il s’agisse d’interagir avec des bases de données, d’effectuer des traitements ou de générer un affichage HTML. Il n’existait alors pas de bibliothèques pour faciliter le développement, à l’exception de quelques frameworks assez lourds dont la prise en main était complexe si l’on était en phase d’apprentissage.

Ce n’est que plus tard, lors de la « bulle Internet » à partir de la fin des années 1990, qu’est arrivée une première vague de frameworks web formalisant, entre autres, un ensemble de patterns de développement permettant d’organiser le code de façon intéressante. Citons le fameux pattern MVC (Modèle-Vue-Contrôleur) qui propose de séparer clairement les données de leur traitement, et de leur affichage.

Fort de ces différents outils et ressources, le développement web s’est encore enrichi à partir de 2005, avec l’introduction de frameworks modernes construits sur des technologies récentes (Ruby on Rails, développé en Ruby) ou en pleine renaissance (Django, développé en Python). C’est d’ailleurs dans ce contexte que nous avons créé en 2006, avec mon ami Cyril, notre plate-forme d’hébergement alwaysdata.com, faite par et pour les développeurs, avec comme ligne directrice la prise en charge d’un maximum de technologies web.

En quelques années, Django a mûri : non seulement techniquement, puisque après une dizaine de versions antérieures, la version 1.5 devrait enfin voir le jour, mais aussi humainement, puisque sa communauté s’est étoffée avec l’organisation régulière de conférences en France et dans le monde. Django a désormais fait ses preuves dans le secteur du développement web, comme en témoignent de nombreuses applications : Disqus (la plus grosse plate-forme de gestion de commentaires), Instagram (rachetée par Facebook), Pinterest, Mozilla Foundation, Libération, 20 minutes, Washington Post, Century 21, National Geographic – pour n’en citer que quelques-unes.

Cet ouvrage vient en renfort d’une documentation officielle en ligne déjà fort bien faite, tant pour les novices que pour les utilisateurs chevronnés de Django. Son auteur, Yohann, a également voulu démocratiser plus encore son framework de prédilection. Ainsi Yohann s’est affirmé en véritable « évangéliste » en mettant son expérience et ses compétences au service de ce livre. Passionné par Django depuis plus de six ans, sa participation à l’émancipation du framework l’a amené non seulement à réaliser de nombreux développements, mais aussi à donner des formations, des conférences et écrire des publications.

Son approche pour faire découvrir Django est très didactique : après une introduction sur la technologie et la démarche entreprise, il propose d’emblée d’entrer dans le vif du sujet en parcourant un spectre très large des fonctionnalités offertes par le framework, et ce, au fil du développement d’une application de A à Z. Vous disposez ainsi, avec ce livre, d’un des tutoriels les plus complets existant à ce jour sur Django. À l’issue de votre lecture, nul doute que vous aurez acquis les notions nécessaires au développement de votre prochaine application.

En espérant que cette lecture fasse naître des idées, je vous laisse entre les mains de Yohann et, pourquoi pas, sur un fond sonore de Jazz manouche…

Nicolas Ferrari

Développeur Django et co-fondateur d’alwaysdata.com

Avant-propos

Le Web a pris une place considérable dans notre quotidien et rend d’innombrables services. À mesure que les sites sont devenus plus riches et interactifs, les outils pour les créer ont évolué, faisant émerger des standards, des techniques et des architectures logicielles variés.

Le besoin s’est alors fait sentir de reformuler ce travail au sein d’ensembles cohérents permettant de manipuler des concepts abstraits, et avec des méthodes de travail adaptées aux nouveaux standards. C’est ainsi qu’est né le framework Django, offrant une boîte à outils pour créer des applications riches et modernes… « pour perfectionnistes pressés », comme le disent ses créateurs ! Nous vous invitons au travers de ce livre à en découvrir toute la puissance.

Pourquoi ce livre ?

Nombreux sont les sites français écrits avec le framework Django, et pas des moindres : Libération, 20minutes, Autolib, etc. Et pourtant, point de documentation en français à destination des développeurs web francophones. Ce livre vient combler cette lacune et expose tous les concepts fondamentaux à maîtriser, en les illustrant d’exemples et de cas pratiques.

À qui s’adresse le livre ?

Ce livre vient prolonger l’ouvrage Apprendre la programmation web avec Python et Django de Pierre Alexis et Hugues Bersini. Il suppose chez le lecteur, qu’il soit amateur éclairé ou développeur professionnel, une connaissance de Python. Il s’adresse aussi bien au développeur souhaitant aborder un nouveau framework, qu’à celui ou celle qui ne connaît pas encore le développement web.

Quant au lecteur qui connaît et utilise déjà Django, il verra au fil d’exemples réels comment résoudre certains problèmes complexes auxquels il peut être confronté.

Comment ce livre est-il organisé ?

Ce livre est composé de trois parties qui suivent la progression du lecteur dans sa maîtrise de Django.

La première partie est composée de deux exemples d’apprentissage. Le premier explique les fondement de Django, son installation, sa prise en main et la création d’une première application, à savoir un outil de suivi de bogues. Le second permet très tôt de manipuler les concepts plus avancés de Django en créant un agenda partagé.

Dans la deuxième partie de ce livre, vous apprendrez à utiliser les différentes facettes de Django avec des exemples permettant de reproduire facilement les concepts que nous aborderons : gestion de la base de données, traitement de l’information et manipulation de formulaires seront au programme.

Enfin, dans la troisième partie de ce livre, vous découvrirez des méthodes bien plus avancées qui vous permettront de tirer parti de Django de manière parfois inattendue : après une revue des applications contribs vous manipulerez et créerez des API REST avec une authentification OAuth2. Nous dévoilerons ensuite quelques secrets du framework Django tirés de notre expérience professionnelle, avec entre autres un générateur de classes pour le prototypage d’applications.

Remerciements

Avant toute chose, je souhaite remercier très chaleureusement Karine Joly, mon éditrice, qui a su me soutenir et me guider tout au long de l’écriture de ce livre et toute l’équipe des éditions Eyrolles : Anne Bougnoux, Sophie Hincelin, Anne-Lise Banéath, Laurène Gibaud, Gaël Thomas et Muriel Shan Sei Fan, pour son soutien de tous les instants. Je tiens également à remercier Thomas Petillon, qui a profondément contribué à cet ouvrage par sa relecture technique et ses conseils avisés – terriblement précieux pour moi.

Je souhaite également remercier mon ami de longue date, Rodolphe Quiédeville, pour m’avoir mis entre les mains un premier CD-Rom de Debian, et m’avoir ouvert les portes du logiciel libre. Ce livre n’aurait tout simplement pas existé sans lui.

Merci à toute l’équipe de PilotSystems pour m’avoir soutenu lors de la rédaction de ce livre : David Sapiro, Gaël le Mignot, Léo Bernard, Bruno Dupuis, Eve Marie Thivolle.

Merci à Christelle, Esteban et Louise. Pour être là.

Merci enfin à tous les autres, qui se reconnaîtront.

1

Bien démarrer avec Django : installation et initialisation d’un projet

Après l’installation des outils qui nous serviront tout au long de l’ouvrage, nous initialiserons un premier projet.

Installer un bon environnement de travail

L’environnement de travail dans lequel vous allez évoluer et les outils utilisés sont très importants pour la qualité future de votre développement.

Choisir entre éditeur de texte et EDI

En tant que développeur, vous avez sans doute un outil de prédilection que vous ne changeriez pour rien au monde. Certains travaillent avec un « simple » éditeur de texte, comme Notepad++ (sous Windows), Gedit ou Geany (sous Linux), ou encore TexMate (sous Mac OS X). D’autres optent pour un environnement de développement intégré (EDI) comme Eclipse, surtout s’ils viennent du monde Java. Mais peut-être préférez-vous ces éditeurs d’un autre âge que sont Emacs ou Vim, certes antédiluviens mais terriblement puissants ? Dans tous les cas, Django s’intégrera parfaitement à la solution que vous aurez retenue.

Installer Python

Python est le langage de programmation sur lequel est basé Django, son installation est nécessaire (et nous conseillons son apprentissage).

RÉFÉRENCES

G. Swinnen, Apprendre à programmer avec Python, Eyrolles.

P. Alexis et H. Bersini, Apprendre la programmation web avec Python et Django, Eyrolles.

VERSION Pourquoi Python 2.7 ?

C’est en décembre 2008 que la version 3.0 du langage Python a vu le jour. Elle est incompatible avec les précédentes versions, numérotées 2.x. Or c’est la version 2.7 du langage qui peut être vue comme celle stable à ce jour.

L’équipe de développement de Django est en train de mener un énorme travail de refonte afin que le framework devienne compatible avec la série 3.x. Ce travail est aujourd’hui bien avancé, et un support bêta de Python 3 a vu le jour dans la toute récente version 1.5 de Django. Il faudra attendre la version 1.6 du framework pour que Django soit pleinement compatible avec Python 3.

Installation sous Linux

L’installation de...

2

Créer sa première application : un tracker

Dans ce chapitre, vous allez créer votre première application. Ce faisant, vous découvrirez progressivement certaines des fonctionnalités majeures de Django. Loin des « wiki en vingt minutes » et autres « mon premier blog en Django », ce premier projet vous accompagnera tout au long du livre et, nous l’espérons, bien au-delà. Vous allez créer un tracker, outil qui tracera l’avancement de votre projet en vous donnant une vision claire de votre travail et du temps que vous y consacrez.

De la méthode et un framework adaptable

Nous n’allons pas créer d’emblée toutes les fonctionnalités de notre projet, de la base de données vers l’interface graphique, comme cela se faisait il y a encore quelques années avec le mode de développement par cahier des charges. Cette manière de procéder est à éviter à bien des égards. Entre autres, vous risquez les deux écueils suivants.

• Oublier une fonctionnalité majeure. Au beau milieu de votre projet, vous vous apercevez que vous avez oublié un élément primordial. Seulement, vous avez déjà créé la base de données et les fonctions principales du cœur de votre application ; modifier toutes ces fonctions est un tel travail que vous n’avez plus qu’à tout reprendre depuis le début ou, tout simplement, abandonner le projet.

• Coder une fonctionnalité inutile. Bien que ce cas paraisse moins grave que le précédent, il se produit plus souvent que l’on ne le pense. En imaginant l’application, vous croyez que telle ou telle fonctionnalité sera indispensable ou très utile. Vous codez donc votre application autour de cette pièce maîtresse. En réalisant les premiers tests fonctionnels, vous vous apercevez que cette fonction n’est finalement pas utile, voire qu’elle gêne le reste du projet. C’est bien souvent dans les dernières étapes, lorsque l’on dessine l’interface web de l’application, que les problématiques de ce genre se font jour. Il faut alors repenser entièrement le programme, ce qui peut bien souvent mener à l’abandon du projet

Une autre raison de rejeter le développement par « cahier des charges » est sans doute d’ordre plus personnel. En effet, lorsque l’on est seul sur son projet, avec pour seul appui sa motivation, devoir s’atteler à une tâche parfois de plusieurs mois avant de récolter les fruits de son travail est très vite décourageant.

Pour éviter ces écueils (et bien d’autres), nous vous proposons de découvrir dès votre premier projet une autre méthode : le développement par itérations.

Le développement par itérations

Le développement par itérations consiste à créer un programme par petites parties indépendantes les unes des autres. Si, par exemple, vous devez gérer une liste d’utilisateurs, vous commencerez par créer un objet utilisateur, puis l’interface nécessaire pour le manipuler. Démuni de fonctionnalités, cet embryon d’application n’en sera pas moins pleinement fonctionnel ; vous pourrez le manipuler, « jouer avec », le tester dans différentes situations et détecter très rapidement les éventuelles erreurs de conception. À ce niveau de la vie de l’application, il n’est évidemment pas question de régler tous les détails graphiques, tous les cas particuliers. Il s’agit seulement d’en dessiner les grandes lignes et de pouvoir manipuler l’objet pour découvrir très tôt ses failles et ses qualités. Une fois que ce bloc de fonctionnalités vous semblera satisfaisant, vous ajouterez alors de nouvelles briques à l’ensemble en procédant de la même manière. Ainsi, brique après brique, vous verrez votre application grandir, mûrir, évoluer avec, à chaque fois, la possibilité de modifier, transformer et adapter votre application à de nouveaux cas.

L’un des avantages principaux de développer une application web à l’aide d’un framework, et c’est particulièrement vrai avec Django, est d’obtenir rapidement des résultats tangibles, ce qui est évidemment bienvenu dans le cadre d’un développement par itérations. Dès cette première application, vous allez vous rendre compte à quel point Django vous offre la possibilité de modéliser rapidement les premières briques en quelques commandes seulement.

Un framework transparent et adaptable

Très souvent, cette rapidité de développement souffre d’un revers de taille. En effet, lorsque vous souhaitez sortir de ce qui est prévu par le framework, les choses commencent à se gâter. Mais, après plusieurs années de développement avec Django, nous vous assurons qu’il n’en est rien.

Cela tient en définitive à deux choses.

• Tout d’abord, Django repose sur le langage de programmation Python. La nature interprétée et dynamique de ce dernier rend son utilisation très souple et polymorphique : il est par conséquent très simple de modifier la façon dont fonctionne ici une fonction, là une classe.

• La seconde raison tient à une volonté précise des créateurs de Django qui, le 1er mai 2006, ont pris la décision de supprimer la « magie » de ce framework. Cela a principalement consisté à enlever tous les éléments qui cachaient aux développeurs le fonctionnement interne de Django. Désormais, ils peuvent modifier entièrement son comportement pour un besoin précis et l’adapter à volonté. À la fin de ce livre, dans la partie consacrée aux techniques avancées avec Django, nous aborderons plusieurs exemples de modifications de ce type.

Nous allons vous guider pas à pas dans le fonctionnement interne de Django. L’idée n’est pas de vous assommer dès le début avec des concepts complexes, mais de reprendre son principe de fonctionnement grâce à un exercice didactique et d’en retirer toute la magie (ou au moins une partie).

De l’utilité d’un tracker

Comme premier exercice, nous vous proposons de créer votre premier outil : un tracker.

Organisation du travail

Dans sa forme la plus basique, un tracker est une sorte de liste de choses à faire qui aide à maintenir un cap dans l’évolution d’un projet. Élément indispensable du travail en équipe, il en assure la cohésion et indique à tous qui fait quoi et sur quelle partie du code.

Même lors d’un travail solitaire, un tracker vous rendra de fiers services. Lorsque vous reviendrez à votre projet après quelques jours d’inactivité, vous saurez, grâce à lui, quelles tâches il vous reste encore à accomplir. Vous en garderez ainsi une vision claire et maintiendrez son évolution avec sérénité.

Gestion du temps

Un tracker vous aidera également à gérer votre charge de travail en fonction de vos disponibilités, à planifier les futures évolutions de votre projet et à estimer le temps passé sur telle ou telle fonctionnalité. Cette capacité à gérer votre projet dans le temps garantit une évolution stable et vous fournit les atouts indispensables à sa réussite.

Gestion des jalons

Un autre point fort d’un tracker réside aussi dans l’utilisation intelligente de jalons qui marqueront les différentes étapes de votre projet. Un jalon se définit comme une liste des choses qu’il reste à accomplir avant qu’une partie ou une fonctionnalité du programme soit opérationnelle. C’est particulièrement utile dans un mode de développement par itérations, où chaque jalon correspond à une itération précise. Un tracker vous permettra donc de mesurer et de suivre l’évolution de votre projet, jalon après jalon.

Historique

Enfin, vous serez en mesure de garder une trace de votre travail et du temps nécessaire à son accomplissement. Comme vous enregistrerez le temps passé sur chacune de vos tâches, et donc le temps global passé sur un jalon, vous pourrez y revenir pour estimer la somme des efforts qu’il vous aura fallu fournir pour mener...

3

Des bases à la production : créer un agenda partagé

Le tracker que vous venez de réaliser n’était qu’un prétexte pour vous apprendre les grands principes de Django. Maintenant que vous avez découvert les bases du framework, vous êtes fin prêt à rédiger une application complète : un agenda partagé. Pour ce faire, vous allez bien entendu réutiliser une partie de ce que vous avez découvert précédemment.

Un agenda partagé n’est pas si différent de l’application que vous venez de créer, car c’est aussi un outil de gestion du temps. Cependant, là où un tracker est destiné plutôt à des développeurs de logiciels, l’agenda s’adresse à tous. Vous n’allez pas pour autant abandonner le tracker que vous avez conçu. Bien au contraire, au cours de l’évolution de l’agenda partagé, nous en continuerons le développement à titre d’exercice. Nous vous conseillons également de l’utiliser pour vous-même, d’ajouter des tâches, de les ouvrir et de les fermer, et de suivre l’évolution de votre travail. Outre les intérêts d’une telle technique que nous avons déjà abordés, cela vous permettra de faire du dog fooding.

JARGON Dog fooding

Le dog fooding est une expression qui se réfère au fait de goûter soi-même ce qu’on donne à manger à son chien. Au sens figuré, le plus souvent dans le cadre du développement logiciel, il s’agit d’éprouver soi-même les outils que l’on a créés en les utilisant, afin d’en confirmer les mérites en termes d’efficacité, de richesse, etc.

C’est bien souvent l’usage qui détermine les fonctionnalités d’un logiciel. En employant le tracker que vous avez créé, vous déterminerez aisément les fonctionnalités qui vous manquent et serez donc en mesure de les développer, de les tester par l’utilisation, et ainsi de suite. Après de longues heures d’utilisation, vous aurez à votre disposition un tracker parfaitement adapté à vos besoins et un agenda partagé que vos amis auront plaisir à utiliser.

Fonctionnalités de l’application

Ajoutons aux bases d’un tracker quelques principes tirés d’un réseau social, un peu de mise en forme… et nous obtiendrons un agenda partagé ! Un utilisateur crée un agenda, dans lequel il enregistre des événements et invite d’autres utilisateurs. Il peut alors gérer les participants, consulter les événement auxquels il a été invité, les réponses qu’il a données ou reçues, etc. Nous traiterons donc dans cette section la gestion d’un calendrier et des événements, le flux des invitations, etc.

Cette deuxième application, comme la première, n’est bien entendu qu’un prétexte pour apprendre à maîtriser les concepts fondamentaux de Django. Néanmoins, l’objectif avoué est qu’à la fin, vous ayez entre les mains une application parfaitement fonctionnelle. À chaque étape, vous pourrez comparer votre travail aux exemples de code présents sur https://bitbucket.org/boblefrag/livre_django_agenda. Nous vous indiquerons, avant chaque extrait de code, la révision à laquelle vous devez vous rendre pour obtenir la correction, de la manière suivante :

rev 65

Création de la base de données.

Comme cela est précisé dans le titre de ce chapitre, cette application va être développée jusqu’à sa mise en production. Ainsi, le premier démarrage sera un peu différent de ce que vous avez appris lors de la mise en place du tracker.

Un environnement complet

Pour cette application, nous proposons de mettre en place un environnement...

4

Gestion de l’authentification

Dans le développement web, l’authentification des utilisateurs est un problème récurrent. Comme Django est un framework pragmatique, il propose un système simple, performant et robuste pour authentifier vos utilisateurs. Dans de nombreux cas, il vous faudra créer, gérer et authentifier les utilisateurs de votre site, à la fois pour personnaliser votre contenu et pour restreindre l’accès à certaines données.

Authentifier un utilisateur sur le site

Avant d’étudier les aspects plus avancés de la gestion des utilisateurs, il faut déjà que le site que vous concevez soit en mesure de reconnaître un visiteur. La technique la plus couramment employée est de proposer un formulaire avec les champs nom d’utilisateur et mot de passe. Django propose une mise en place de ce type de page en seulement deux étapes.

1 Ajouter les URL login et logout.

2 Créer les templates login et logout.

Ajouter les URL login et logout

Dans l’application auth des contribs, vous trouverez un module views qui contient déjà les fonctions login et logout. Il vous suffit de les appeler dans vos URL pour les rendre immédiatement disponibles. Elles gèrent pour vous tout ce dont vous avez besoin pour identifier un utilisateur. Voici comment vont se présenter vos URL (fichier urls.py dans le dossier agenda) :

from django.conf.urls.defaults import patterns, include, url
from django.contrib.auth.views import login, logout

# Uncomment the next two lines to enable the admin:

# from django.contrib import admin

# admin.autodiscover()

urlpatterns = patterns('',

# Examples:

# url(r'^$', 'agenda.views.home', name='home'),

# url(r'^agenda/', include('agenda.foo.urls')),

# Uncomment the admin/doc line below to enable admin documentation:

# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

# Uncomment the next line to enable the admin:

# url(r'^admin/', include(admin.site.urls)),

url(r'^accounts/login/$', login),

url(r'^accounts/logout/$', logout, {'next_page':'/accounts/login/'}),

)

Remarque

L’URL url(r'^accounts/logout'/$, logout, {'next_page':'/accounts/login/'}) est un peu différente de celles que vous avez pu voir auparavant. Elle contient un dictionnaire {'next_page':'/accounts/login/'} qui va être utilisé par la vue login pour connaître l’URL vers laquelle il faut rediriger un utilisateur après qu’il s’est déconnecté.

Figure 4–1 Le template n’existe pas.

Si vous testez ces URL en lançant le serveur de développement de Django et en accédant à localhost:8000/accounts/login, vous verrez s’afficher l’écran de la page précédente (voir figure 4-1).

Créer le template login

Comme vous le signale Django, il vous manque le template registration/login.html. Créez le dossier registration dans le dossier templates à la racine de votre projet. Vous avez déjà indiqué à Django où se trouvent vos templates dans settings.py :

TEMPLATE_DIRS = (

project_path + 'templates'

)

Dans le dossier registration, il vous faut créer un fichier login.html, contenant le formulaire HTML de login qui a déjà été préparé par la vue login de django.contrib.auth.views. Il vous suffit de l’appeler de la façon suivante :

{{form.as_p}}

Ici, il est demandé à Django d’afficher le formulaire sous forme de paragraphe (as_p), mais vous pouvez...

5

Création d’un événement

Vous disposez à présent d’une application d’authentification fonctionnelle ; vous pouvez penser librement à l’application principale. Avant tout, laissons les utilisateurs créer leurs propres événements.

Dans le précédent chapitre, vous avez utilisé les formulaires de Django pour créer et connecter un utilisateur, mais vous n’avez jamais eu besoin de créer de toutes pièces un formulaire. C’est ce que vous allez faire maintenant. Toutefois, comme le formulaire de création d’un événement repose sur un modèle que vous avez défini dans le fichier models.py, vous allez profiter de la puissance de Django, qui va automatiquement créer pour vous les bases d’un formulaire fonctionnel.

Les ModelForm

Les ModelForm sont, comme leur nom l’indique, des formulaires basés sur des modèles. Voici comment les utiliser :

1 ajouter au sein de votre application un fichier forms.py destiné à recueillir tous les formulaires que vous créez ;

2 importer ModelFormdepuis django.forms ;

3 créer une classe héritant de ModelForm ;

4 définir la classe Meta dans laquelle vous indiquez le modèle auquel vous faites référence ;

5 utiliser votre formulaire dans vos vues, de la même manière que le formulaire de création d’utilisateur.

Comme vous le voyez, c’est enfantin. Django va se charger pour vous de définir le type des champs, de valider les informations renvoyées par l’utilisateur et, bien entendu, de la sauvegarde dans la base de données.

Création du formulaire

Créez dans le dossier personal_calendar le fichier forms.py pour y stocker vos formulaires.

from django.forms import ModelForm

from personal_calendar.models import Evenement

class EventForm(ModelForm):

class Meta:

model = Evenement

Vous héritez de ModelForm et créez une nouvelle classe qui en hérite. L’attribut model de sa classe Meta servira à Django pour créer automatiquement le formulaire. Pour inclure ce formulaire sur votre site, suivez le fonctionnement habituel : créez une nouvelle URL dans personal_calendar/urls.py – ce fichier n’existe pas encore, il vous faut le créer –, par exemple :

Création du fichier urls.py

from django.conf.urls.defaults import patterns, include, url

from views import create

urlpatterns = patterns('',

url(r'^create/$',create,

))

Référencez ces nouvelles URL dans le fichier urls.py du dossier agenda :

url(r'^agenda/', include('personal_calendar.urls')),

Puis créez la vue correspondante :

from forms import EventForm

from django.shortcuts import render, HttpResponseRedirect

def create(request):

if request.method == "POST":

form = EventForm(request.POST)

if form.is_valid():

form.save()

return HttpResponseRedirect('/agenda/create/')

else :

form = EventForm()

return render(request,'personal_calendar/event/create.html',{'form':form})

Comme vous le voyez, la vue que vous venez d’écrire est identique à la vue de création d’utilisateur que vous avez déjà conçue. Créez ensuite le fichier HTML du formulaire (encore une fois, un template que vous connaissez déjà) :

<form action="" method="POST">

{% csrf_token %}

{{form}}

<input type="submit" value="Créer" />

</form>

Il vous suffit alors d’afficher le formulaire dans votre navigateur (voir figure 5-1).

Figure 5–1 Le formulaire de création d’événement

Si vous tentez dès maintenant de créer un nouvel événement, Django va relever une erreur (voir figure 5-2).

Figure 5–2 Erreur many-to-many

En effet, votre modèle Evenement est un peu particulier ; il possède une clé étrangère vers un objet User au travers de la table Evenement_Participant. Django ne sait pas comment gérer ce type de situation. Néanmoins, comme ce champ n’est pas...

7

Les vues génériques pour les fonctions d’agenda

Depuis que vous avez commencé l’application d’agenda partagé, vous avez écrit chacune de vos fonctions dans les vues. C’est souvent la manière la plus simple et la plus rapide pour ébaucher une application. Cependant, à mesure que votre connaissance de Django va évoluer, vous allez utiliser des mécanismes beaucoup plus puissants : les vues génériques.

Les vues génériques depuis Django 1.3

Les vues génériques existent dans Django depuis longtemps. C’est seulement depuis la version 1.3 qu’elles sont devenues incontournables dans les applications Django. Autrefois, il s’agissait de fonctions génériques pour remplir rapidement des tâches simples. Néanmoins, dès que vos besoins gagnaient en complexité, il était nécessaire de les abandonner ou de les détourner.

Aujourd’hui, les vues génériques ne sont plus de simples fonctions, mais des classes. Leurs objectifs sont inchangés : vous simplifier la vie et accélérer le développement de vos applications. La vraie grande nouveauté réside dans le très puissant système d’héritage mis en place. Ce principe de classe vous permet d’écrire moins de code pour des fonctionnalités équivalentes et, surtout, de jouer beaucoup sur la « réutilisabilité ». Le fait qu’il s’agisse de classe et non plus de fonction vous donne une très grande souplesse dans l’élaboration de vos fonctionnalités. Vous pouvez les employer telles quelles, les modifier, en hériter pour créer les vôtres. Les vues génériques sont désormais une nouvelle façon de développer une application.

Les bases des vues génériques

Les vues génériques peuvent être utilisées à plusieurs niveaux. Au niveau d’abstraction le plus haut, elles servent, sans configuration particulière, à implémenter toutes les fonctionnalités d’une application CRUD : dans notre cas, afficher une liste d’événements, et afficher, créer, modifier et supprimer un événement. L’origine de Django, issu de la presse Internet, fait qu’il existe également des vues génériques basées sur les dates, années, mois, semaines, jours…

Ces vues génériques sont à la fois très simples et très souples. Elles ont été écrites pour que vous puissiez les étendre, modifier...

Index

__doc__ 83

__unicode__ 48, 194

A

admin

change_list_result 387

surclassement des templates 386, 387

template 385

admin.py 45

administration

__unicode__ 356

activer l’interface 350

afficher des champs 362

delete_model 367

documentation 354

filtre 361

formulaire 362, 367

héritage 352

HTML 359

list_display 355

maintenance 353

ModelAdmin 366

objets liés 364

objets reliés 358

ordonner les résultats 362

personnaliser l’affichage 357

pour les utilisateurs 354

prototypage 350

recherche 360

save_model 366

sécurité 353

sélectionner les champs 357

agrégation 284

Ajax 156, 262

amélioration des URL 180

API REST 319, 326

filtrer les ressources 330

application

ajouter à settings.py 43

ajouter à...