# Sortie de Django 1.0, une année de nouveautés

J'étais assez sceptique lors de l'annonce de la roadmap avant l'été mais il faut bien avouer que ça n'a pas chômé pendant ces vacances et que les développeurs sont arrivés à bout des fonctionnalités annoncées. Chapeau bas. Je ne vais pas faire un inventaire exhaustif des nouveautés (je vous laisse consulter la page dédiée) mais plutôt une liste des ajouts vraiment intéressants au quotidien au cours de cette dernière année.

## Support complet de l'Unicode

Mergée l'été dernier, le nom de cette branche est assez explicite. Terminés les problèmes de charset/encoding lorsqu'on a des données propres, sinon iconv est votre ami.

## Commandes personnalisées

La refactorisation des commandes internes de Django permet depuis un an d'ajouter très facilement des commandes personnalisées à votre projet. Vous pouvez par exemple voir ce que ça donne sur le script qui récupère les flux affichés dans la sidebar de ce site.

## Échappement des variables dans les templates

Changement de la politique de sécurité en novembre dernier avec les variables échappées par défaut. Selon les cas, ça peut être pénible pour les mises à jour mais c'était à mon avis utile pour permettre aux débutants de ne pas faire trop d'erreurs à ce niveau. Il est toujours possible de contourner cette restriction via le filtre `|safe` ou le tag `autoescape` (great power, great responsabilities, tout ça).

## Refactorisation des querysets

Fin avril, un énorme boulot est effectué en interne afin de corriger pas mal de bugs récalcitrants, ça permet (entre autres) d'ordonner plus facilement les querysets, de spécifier les champs couverts par un `select_related`, d'optimiser la façon de filtrer les résultats, de mettre à jour plusieurs instances d'un coup et surtout, le retour de l'héritage au niveau des modèles !

## Modifications dans l'upload de fichiers

Début juillet, ça commence à s'accélérer, il est maintenant possible de lire les fichiers uploadés partie par partie. Ça n'a l'air de rien mais selon les types de fichiers sur lesquels vous travaillez ça peut vraiment faire la différence.

## Nouvelle administration utilisant les newforms

C'est LA fonctionnalité qui donne à mon avis à Django une longueur d'avance sur les autres frameworks. Ajoutée mi-juillet, cette branche permet de générer une interface d'administration qui tient compte des droits utilisateurs, qui est vraiment flexible et customisable. L'interface qui était réservée aux personnes de confiance (administrateur) peut maintenant être utilisée pour développer un site complet. Le problème c'est qu'à partir de cette date là, avec les vacances et les commits qui s'accélèrent il devient plus prudent d'attendre la 1.0 et cette fonctionnalité n'a pas eu la promotion qu'elle méritait à mon avis. Cela dit il est temps de tester sa puissance maintenant, je joue avec depuis quelques jours et c'est vraiment du bonheur.

## Ajout du support géographique

GeoDjango est enfin ajouté dans les contrib, très beau projet avec énormément de fonctionnalités indispensables lorsque vous commencez à vouloir savoir qui habite près de qui, quelle est la distance parcourue, etc.

## Refactorisation des stockages de fichiers

Bon celui là c'est un peu mon chouchou car je l'ai testé à plusieurs reprises pour faire des retours à Marty Alchin et ça m'a mené à partager certains storages utiles pour Django. Il permet par exemple de stocker ses fichiers en local pour du développement et sur S3 pour de la production ou n'importe quelle combinaison possible et imaginable.

## Nouveau système de commentaires

Pour finir, ce qui était attendu depuis... toujours, un GSoC est arrivé à terme ! Les commentaires ont été entièrement réécrits, j'utilise une version alpha de cette implémentation et je ne sais pas si je mettrais à jour, peut-être à l'occasion mais elle a l'avantage de ne pas être standard et pour lutter contre le spam on ne fait pas mieux ;-).

Enfin, il y a eu pas mal de ménage de fait sur d'anciennes parties de code (suppression des oldforms/validators entre autres), ce qui le rend plus facilement maintenable et une nouvelle documentation propulsée par Sphinx (l'outil qui mériterait un petit système de tickets pour être tout à fait parfait). Que du bon. De mon côté, on peut pas dire que j'ai vraiment avancé sur mes tickets, j'ai pas mal discuté de l'intérêt de l'utilisation du tag url dans blocktrans et au final la solution est venue presque par hasard ! J'ai pas eu le temps de m'occuper de tout ce qui était relatif à la séparation des tests mais j'ai mis à jour les traductions (ce qui représentait un sacré boulot, heureusement que j'ai eu de l'aide de la team fr).

Une année riche en nouveautés qui montre le dynamisme du framework, la 1.0 n'était qu'une étape nécessaire permettant de partir d'une base saine. Il y a encore 2/3 choses qui méritent d'être remises à plat pour la 1.1 mais sinon c'est clairement positif. Avec de telles fondations, il devient de plus en plus facile de développer son projet parfait, en tenant les délais ;-). Il ne manque plus que la sortie de Starcraft 2 pour faire le grand chelem...

PS : ça sort dans quelques heures, un peu de patience, je le publie maintenant suite à une petite erreur de ma part. En attendant qu'est-ce qui vous pousse/retient d'utiliser cette version ?

[edit du soir] : bon finalement ça commence par une faille de sécurité qui sera suivie d'une RC1.

[edit du 4 septembre, 1h47] : sortie de la version 1.0. Enfin.

La page officielle de migration est un bon début si vous n'êtes pas à jour.

### Articles peut-être en rapport

- Scrum, Python et Django à Montpellier
- Son propre TinyURL en Python et HTML5 avec webpy
- ★ Conférences Django pour PyCon fr

### Commentaires

Thomas le 02/09/2008 :

J'attendais cette version pour me mettre à Python et Django. Par où commencer pour apprendre Django 1.0 (le DjangoBook a besoin d'être mis à jour ?) ?

David, biologeek le 02/09/2008 :

@Thomas : je pense que la nouvelle doc est la seule à être à jour pour l'instant et c'est suffisant pour commencer. Le tutoriel est un bon début : http://docs.djangoproject.com/en/dev/intro/tutorial01/#intro-tutorial01

vincent le 02/09/2008 :

@thomas : je crois que oui, le djangobook a besoin d'être mis à jour. Pour commencer, lire la documentation (de préférence la doc de dev' lié par David ci-dessus)

Personnelement j'attendais la release (et le fin de mon stage et donc de mon cursus ingénieur) pour mettre à jour mon développement django actuel (un site perso quoi). Cette version stable devrait amener la reconnaissance que mérite ce framework.

J'étais aussi un peu sceptique sur la roadmap au début, mais vu le travail qu'ils ont fournis !

Julien Phalip le 02/09/2008 :

Merci pour cette recapitulation des nouveautes et merci pour ta contribution a toi aussi! ;)
Je predis un enorme succes pour Django, qui devrait supplanter la plupart des frameworks web durant ces prochains mois.

David, biologeek le 02/09/2008 :

@vincent : tu t'es fait doublé par Gilles je crois ;-)

@Julien Phalip : merci pour tes relectures, n'hésite pas à passer sur #django-fr un de ces 4.

NiCoS le 02/09/2008 :

Même si certains éléments ne sont plus d'actualité, le django book a à mon avis l'intérêt de poser les principes du framework et je dirais même jusqu'à une méthode de développement avec Django. Pour le détail, il faut en effet se référer à la doc officielle.

Si la version 1.0 doit sortir ce jour, je suis étonné qu'elle ne passe pas par le stade des RC, pourtant annoncées. Je n'ai pas suivi la liste django-dev depuis quelques temps, donc ceci peut peut être expliqué cela...

David, biologeek le 02/09/2008 :

> Si la version 1.0 doit sortir ce jour, je suis étonné qu'elle ne passe pas par le stade des RC, pourtant annoncées.

En fait la Beta2 a plus ou moins le statut de RC. Il y avait du retard donc ils ont mergé les deux si je me rappelle bien.

er:k le 02/09/2008 :

Info ou intox ? ;-) en tout cas, pas d'infos sur http://djangoproject.com sur la sortie de la version 1.0 définitive.

Merci en tout cas pour ce résumé des nouvelles fonctionnalités de Django 1.0 (je pense que l'apparition de l'héritage des modèles [1] est également une nouveauté à souligner) et pour ton travail sur le projet.

[1] http://www.djangoproject.com/documentation/model-api/#model-inheritance

David, biologeek le 02/09/2008 :

Comme je le précise en PS, il y avait un problème dans mon code qui a publié le billet alors qu'il était à l'état de brouillon sur le planet de django, du coup j'ai préféré publier plutôt que de faire tomber sur une 404 toute la journée alors que c'est pas officiellement sorti.

Je mettrais à jour le billet lorsque ça sera effectivement le cas (probablement cette nuit pour nous).

Efel le 03/09/2008 :

J'essaie d'apprendre ce framework qui a l'air vraiment bien conçu, mais ce n'est pas évident de s'y retrouver entre les tutos pour la 0.96 et la pratique dans la 1.0

Existe-t-il (sinon ce serait un bon plan) un document de référence des modifications de syntaxe (ex:maxlength => max_length). Pour les MAJ cela me paraît intéressant.

Bravo pour le suivi de la feuille de route... je n'y croyais pas trop non plus.

Efel le 03/09/2008 :

Au temps pour moi, je viens de trouver...

http://docs.djangoproject.com/en/dev/releases/1.0-porting-guide/

NiCoS le 03/09/2008 :

Ah, ils ne m'ont pas fait mentir, ils ont sorti une RC ;-)

http://groups.google.com/group/django-developers/t/db75926db673c071

En même temps d'ailleurs qu'une annonce de sécurité pour les versions antérieures (0.96, 0.95 et 0.91)

http://groups.google.com/group/django-developers/t/7e5f22acb1dc2d87

Sinon David, pour toi c'est quoi les 2/3 choses qui doivent être remis à plat pour la 1.1 ??

David, biologeek le 04/09/2008 :

@NiCoS : agrégation, optimisations (cf #17 entre autres), gestion des applications, multithreading (cf http://code.djangoproject.com/wiki/DjangoSpecifications/Core/Threading), définition des URL et sûrement un paquet d'autres trucs que j'oublie.

cambuntu le 08/09/2008 :

j'ai besoin de plus d'info sur "Nouvelles administrations utilisant les newforms" je dois faire evoluer l'interface d'administration d'un site que j'ai réalisé mais je ne sais pas trop comment m'y prendre et en plus dans mon model "Personne" je dois uploader une photo l'interface admin le fait bien mais n'affiche pas la photo lorsque je retourne a la page "liste" comment resoudre ce probleme Merci

JP henskens le 25/09/2008 :

Bonjour,

Je suis de l'autre coté de la barrière et je m'occupe d'un département ebusiness dans une grosse entreprise. Nous sommes sur le point de choisir un partenaire pour nos dévelopement web et sommes très intéressés par Django.
Cependant, j'ai un mal fou à trouver des agences/companies/sociétés qui développent en Django.

Auriez-vous des références (pas des clients mais des "providers") qui utilisent Django comme framework pour leur clients ?
N'importe où dans le monde (avec une préférence pour l'Europe centrale)

D'avance merci !

cambuntu le 20/01/2009 :

Salut, j'ai un problème je voudrais redéfinir la méthode save() de mes modèles seulement je ne sais pas quand c'est un update ou une insertion svp renseigner moi un peu dessus en attendant la prochaine version de django comment gerer vous la validation des modèles dans le module admin

David, biologeek le 20/01/2009 :

@cambuntu : pour ton premier problème, tu peux regarder ce qui est fait http://bitbucket.org/david/biologeek/src/tip/journal/models.py#cl-95 (c'est du vieux Django, je suis en train de mettre à jour avec la nouvelle admin, mais ça devrait te donner l'idée), c'est aussi expliquer ici https://larlet.fr/david/biologeek/archives/20080211-astuces-et-bonnes-pratiques-django/

Pour vérifier dans save(), il faut faire un test sur self.id, s'il existe il s'agit d'un update.

@ JP henskens : c'est un peu le gros problème actuellement, la demande est de plus en plus forte mais il y a peu de ressources... pas sûr que je doive m'en plaindre remarque ;-).

nik le 22/01/2009 :

Salut, je viens de debuter avec Django mais j'ai un gros pb comment cacher certains champs dans le module admin car tout mes champs sont présent et obligatoire en plus voici mon modèle

class Societe(model.Model):
capital: model.Integer

class Actionnaire(model.Model):
part:model.Integer

Je ne voudrais pas que le champs capital soit actif dans la page d'administration et lorsqu'on enregistre la part d'un actionnaire que celà augmente le capital svp quelque idées Merci

Aussi je m'abonne a la mailing list je poste personne ne repond peut être mon abonnement n'a pas marché guidé moi svp

cambuntu le 22/01/2009 :

Merci, beacoup ça marche, svp et la validation du modèle dans le module admin comment faire et aussi mes dates je les veux aux format jour/mois/année dans le module admin et je voudrais aussi que ce soit le format imposé dans mes formulaires mais je n'y arrive pas comment faire svp

David, biologeek le 24/01/2009 :

@nik : a priori il faut utiliser les signals ou redéfinir la fonction save() du modèle Actionnaire (si j'ai bien compris).

@cambuntu : il faut définir ses propres formulaires pour l'admin et passer l'argument input_formats au DateField pour chacun d'entre eux (un peu fastidieux...).

Et sinon inscrivez-vous sur la liste de diffusion c'est beaucoup plus pratique pour faire du support :
http://lists.afpy.org/mailman/listinfo/django (nik tu as posté avec quel nom/email ?)

nik le 26/01/2009 :

salut excusez j'ai pas le net a volonté c'est pourquoi je réagit tard bien que le projet me tiens à coeurs

c'est quoi les signals, d'apres ce que je lis sur votre site ils faut redefinir la fonction save() mais mon probleme c'est le montant total il ne doit se modifier que lorsque l'on enregistre un actionnaire il est toujours actifs dont on peut le modifier comment donc le rendre inactifs. avez vous un lien qui montre comment redefinir les formulaires de l'admin.

par rapport aux pb de cambuntu j'ai suivi ce lien http://docs.djangoproject.com/en/dev/ref/settings/#date-format mais ça ne marche pas car je me suis dit que c'est la que django prend le format de date à utiliser à quoi sert il donc.
dans mes formulaires quand je passe la methode input_formats() à un champs ça ne marche plus. Voici ce que je fais
dateContribution =forms.DateField(input_formats='%d/%m/%Y')
mon formulaire n'accepte plus de date à ce moment

David, biologeek le 26/01/2009 :

La documentation sur les signals est ici :
http://docs.djangoproject.com/en/dev/topics/signals/#topics-signals

et celle pour avoir ses propres formulaires dans l'admin est là :
http://docs.djangoproject.com/en/dev/ref/contrib/admin/#id1

Je ne comprends pas le problème d'actif/inactif.

L'argument input_formats attend une liste, il faut donc mettre input_formats=['%d/%m/%Y'] s'il n'y a qu'un élément.

nik le 27/01/2009 :

s.v.p quand je parle d'actif ou inactif c'est ceci vous avez dans votre page un formulaire principale et des formulaires filles vous voulez que le formulaire principale se mette à jours lorsque les formulaires filles sont modifiées, cependant vous ne voulez pas que le formulaires principales soit modifié manuellement il faut donc le rendre inactif qu'on ait accès uniquement en consultations comment donc le faire?
lorsqu'on redéfinie le formulaire comment fait on de tout le javascript qui était présent? et dans les list_pages comment fait on aussi pour avoir les dates au formats voulu las bas
que pensez vous donc du paramètre date_formats dans le fichier settings

cambuntu le 27/01/2009 :

salut, j'ai penser aussi comme nik au paramètre date format du fichier settings mais ça ne marche pas à quoi set il donc, néanmoins je procède comme vous avez conseillé. Cependant dans les pages ou les données sont listés le formats n'est toujours pas changé comment résoudre ce problème la.

S.v.p que pensez vous d'utiliser un fichier print.css pour la générations des report au lieux de passer par reportlab et les pdfs

cambuntu le 27/01/2009 :

svp je lis chaque jour cette page il y'a quelque chose que je ne comprend pas les iconv et les storage, s3 expliquer un peut plus

cambuntu le 06/02/2009 :

salut svp que pensez d`utiliser le fichier print.css pour l`impression de nos reports

Millicent le 23/03/2010 :

C'est vraiment très intéressantes nouvelles, bien que je les ai trouvés un peu tard, mais c'était très intéressant de lire ceci, merci beaucoup.