<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.unelectronlibre.info/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Un Electron Libre... - Python - Django</title>
  <link>http://www.unelectronlibre.info/index.php/</link>
  <description>Bloc-notes de Nicolas Steinmetz</description>
  <language>fr</language>
  <pubDate>Tue, 01 Jul 2008 22:32:32 +0200</pubDate>
  <copyright>Creative Commons NC-BY-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Un mail effacé un peu vite - A mail deleted too quickly (django inside)</title>
    <link>http://www.unelectronlibre.info/index.php/post/2008/05/20/Un-mail-efface-un-peu-vite-A-mail-deleted-too-quickly</link>
    <guid isPermaLink="false">urn:md5:96ec9be3c0fb14c74633484f8485b16e</guid>
    <pubDate>Tue, 20 May 2008 09:28:00 +0200</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
            
    <description>    &lt;p&gt;En consultant mes mails ce matin, en regardant mes spams, j'ai parcoucu la liste d'un oeil rapide en cliquant automatiquement sur &amp;quot;Supprimer tous les spams&amp;quot; quand mon oeil a été attiré par les mots &amp;quot;Parter Django Project&amp;quot; (ou quelque chose d'approchan). Si cette personne lit ce blog, je veux bien qu'elle me renvoit son mail sur la même adresse, je ferais plus attention sur les spams dans les jours à venir &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;When reading my new mails this morning, I jumped to the Spam section and clicked on &amp;quot;Delete all spams&amp;quot; button when my eye was attracted by a title looking like &amp;quot;Partner Django Project&amp;quot; (or something approaching). If the sender read this blog, I would appreciate that he sends me again the related mail on the same email adress. I would be more careful with spam mails in the following days &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Edit : Merci à &lt;a href=&quot;http://www.biologeek.com&quot; hreflang=&quot;fr&quot;&gt;David&lt;/a&gt; pour le forward du mail en provenance de Djangogigs apparemment (tiens, je me rappelle pas m'y être inscrit...)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.unelectronlibre.info/index.php/post/2008/05/20/Un-mail-efface-un-peu-vite-A-mail-deleted-too-quickly#comment-form</comments>
      <wfw:comment>http://www.unelectronlibre.info/index.php/post/2008/05/20/Un-mail-efface-un-peu-vite-A-mail-deleted-too-quickly#comment-form</wfw:comment>
      <wfw:commentRss>http://www.unelectronlibre.info/index.php/feed/rss2/comments/508</wfw:commentRss>
      </item>
    
  <item>
    <title>Lecture : Programmation Python</title>
    <link>http://www.unelectronlibre.info/index.php/post/2008/03/25/Lecture-%3A-Programmation-Python</link>
    <guid isPermaLink="false">urn:md5:459ef68199e62c5c77458d5e228b73b5</guid>
    <pubDate>Tue, 25 Mar 2008 10:26:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>lecture</category><category>programmation</category><category>python</category>    
    <description>    &lt;p&gt;Je viens de terminer la lecture de &amp;quot;&lt;a href=&quot;http://www.amazon.fr/Programmation-Python-Tarek-Ziad%C3%A9/dp/2212116772&quot; hreflang=&quot;fr&quot;&gt;Programmation Python&lt;/a&gt;&amp;quot;, qui possède d'ailleurs son |propre site dédié au livre|http://programmation-python.org/sections/blog|fr].&lt;/p&gt;


&lt;p&gt;J'ai trouvé le livre très intéressant et très complet. J'ai compris beaucoup de choses vu ici et là dans des bouts de code python. Autant &amp;quot;&lt;a href=&quot;http://www.cifen.ulg.ac.be/inforef/swi/python.htm&quot; hreflang=&quot;fr&quot;&gt;Apprendre à programmer en python&lt;/a&gt; m'avait permis d'appréhender python et son modèle objet mais sans forcément me donner toutes les clés, autant là, j'ai l'impression d'avoir une bonne bible sous la main et d'avoir fait un grand pas (quitte à avoir trop de clés dans ma besace &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt; ).&lt;/p&gt;


&lt;p&gt;A sa décharge et au vu de mon niveau actuel en python, y a des pans du livre qui me sont passés au dessus de la tête / que j'ai survolé, estimant que j'y reviendrais surement plus tard.&lt;/p&gt;


&lt;p&gt;Autre petit point négatif mais inhérant à sa date de publication, c'est qu'il ne couvre que la version 2.4 de Python.Sur ce point précis, j'avais hésité avec l'achat de &amp;quot;Au coeur de Python&amp;quot; (&lt;a href=&quot;http://www.amazon.fr/Au-coeur-Python-Notions-fondamentales/dp/2744021482&quot;&gt;Tome 1&lt;/a&gt; et &lt;a href=&quot;http://www.amazon.fr/Au-coeur-Python-Notions-avanc%C3%A9es/dp/2744021954/&quot;&gt;Tome 2&lt;/a&gt;) qui couvre python 2.5. Toutefois, en parcourant ce dernier livre, j'ai eu l'impression de parcourir un peu la documentation à la php.net où on assiste à un listing exhaustif des fonctions disponibles mais sans plus. Je trouve &amp;quot;Programmation Python&amp;quot; pour le coup plus pédagogique et mieux enrobé quitte pour certains points à ne donner que l'essentiel (et un peu plus) et des pointeurs si nécessaire.&lt;/p&gt;


&lt;p&gt;Pour finir sur un point positif, l'aspect méthodologie (test, doctest, design pattern, etc) est très bien documentée et sera complétée dans le livre &lt;a href=&quot;http://www.unelectronlibre.info/index.php/post/2007/10/31/Lecture-%3A-Petit-guide-a-lusage-du-developpeur-agile&quot; hreflang=&quot;fr&quot;&gt;Petit guide à l'usage du développeur agile&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Bref, un livre à lire tant pour des débutants (qui se focaliseront sur la première partie du livre) ou des développeurs plus expérimentés qui se focaliseront sur la seconde partie.&lt;/p&gt;


&lt;p&gt;Il me reste juste à trouver un éditeur de code python qui me va bien pour aller plus loin... (je veux un textmate-like pour Linux)&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>SPE (Stani's Python Editor) 0.8.4.c dispo sous Archlinux</title>
    <link>http://www.unelectronlibre.info/index.php/post/2008/02/19/SPE-Stanis-Python-Editor-084c-dispo-sous-Archlinux</link>
    <guid isPermaLink="false">urn:md5:1a101b9faa02eab31a9fd60b9436b47a</guid>
    <pubDate>Tue, 19 Feb 2008 23:33:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>arch</category><category>python</category><category>spe</category><category>éditeur</category>    
    <description>    &lt;p&gt;Archlinux disposant d'une fort vieille version de &lt;a href=&quot;http://pythonide.blogspot.com/&quot; hreflang=&quot;en&quot;&gt;SPE&lt;/a&gt;, je me suis décidé à mettre à jour le fichier PKGBUILD existant en partant de ce qui existait originellement et aussi du paquet &lt;a href=&quot;http://aur.archlinux.org/packages.php?ID=14174&quot;&gt;spe-svn&lt;/a&gt; (paquet orphelin, tout comme spe jusqu'à ce soir).&lt;/p&gt;


&lt;p&gt;Cela donne donc &lt;a href=&quot;http://aur.archlinux.org/packages.php?ID=2111&quot; hreflang=&quot;en&quot;&gt;SPE 0.8.4.c pour Archlinux&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Pour l'installer :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;yaourt -S spe&lt;/pre&gt;


&lt;p&gt;Par contre, sous Debian Testing, spe ne fonctionne pas suite à un problème de dépendances sur wxpython &lt;img src=&quot;/themes/default/smilies/sad.png&quot; alt=&quot;:-(&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Lecture : The Definitive Guide to Django: Web Development Done Right</title>
    <link>http://www.unelectronlibre.info/index.php/post/2008/01/18/Lecture-%3A-The-Definitive-Guide-to-Django%3A-Web-Development-Done-Right</link>
    <guid isPermaLink="false">urn:md5:a3abf465d798ffb74851ff807b2ba625</guid>
    <pubDate>Fri, 18 Jan 2008 22:05:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>livre</category>    
    <description>    &lt;p&gt;Je viens de terminer la lecture du livre &amp;quot;&lt;a href=&quot;http://www.apress.com/book/view/1590597257&quot; hreflang=&quot;en&quot;&gt;The Definitive Guide to Django: Web Development Done Right&lt;/a&gt;&amp;quot;,écrit par les développeurs principaux du framework python &lt;a href=&quot;http://www.djangoproject.com&quot; hreflang=&quot;en&quot;&gt;Django&lt;/a&gt;, à savoir &lt;a href=&quot;http://www.jacobian.org&quot; hreflang=&quot;en&quot;&gt;Jacob Kaplan-Moss&lt;/a&gt; et &lt;a href=&quot;http://www.holovaty.com&quot; hreflang=&quot;en&quot;&gt;Adrian Holovaty&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Le livre est décomposé en trois grandes parties :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Partie 1 : Présentation de l'outil&lt;/li&gt;
&lt;li&gt;Partie 2 : Dans les entrailles de Django : présentation des modules et &amp;quot;sous-frameworks&amp;quot;&lt;/li&gt;
&lt;li&gt;Partie 3 : Annexes avec des témoignages et de la documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On peut dire qu'à l'issue de la partie 1, vous êtes en mesure de jouer avec Django pour construire une application de démo, simple et sans prétention. A l'issue de la partie 2, vous l'avez bien enrichit et même déployer en production. Si vous avez réussi à intégrer/mémoriser la partie 3, vous êtes un expert Django &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Ce que j'ai bien aimé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le livre se veut plus un guide qu'une documentation : le livre ne va pas présenter dans le détail tous les aspects de Django. Il va en présenter suffisamment pour s'en faire une idée, voir l'intérêt de tel ou tel module mais pas détailler l'option X du module Y. La documentation de référence reste celle &lt;a href=&quot;http://www.djangoproject.com/documentation/&quot; hreflang=&quot;en&quot;&gt;en ligne&lt;/a&gt; et du coup, ils sont à voir comme étant complémentaires et non comme une version papier de la documentation officielle.&lt;/li&gt;
&lt;li&gt;De nombreuses &amp;quot;bonnes pratiques&amp;quot; tant au niveau de Django que du développement web en général sont données au fur et à mesure du livre. J'ai plié un gros nombre de pages pour me rappeler d'intégrer plein de petits trucs dans mes projets actuels.&lt;/li&gt;
&lt;li&gt;Si on connait rien en python, les auteurs fournissent suffisamment d'information pour comprendre la logique de l'ensemble. Globalement je trouve le livre très pédagogique.&lt;/li&gt;
&lt;li&gt;J'ai appris plein de choses que je n'avais pas vu en parcourant la documentation officielle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce que j'ai moins aimé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La partie déploiement est un peu légère à mon goût, je m'attendais à un truc un peu plus solide - pour le coup, c'est pas top évident de déployer une appli django la première fois - surtout quand on vient des applis PHP qui sont &amp;quot;upload &amp;amp; play&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Même si certains choses du livre ont un peu bougé, je pense que ça vaut le coup de l'acheter si on veut se familiariser avec Django. Le livre est également lisible en ligne sur le site &lt;a href=&quot;http://www.djangobook.com/en/1.0/[en&quot;&gt;djangobook.com&lt;/a&gt;. Il paraitrait même que des gens ont proposé de le &lt;a href=&quot;http://lists.afpy.org/pipermail/django/20071217/000374.html&quot; hreflang=&quot;fr&quot;&gt;traduire en français&lt;/a&gt; &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Djangoseries du moment</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/12/11/Djangoseries-du-moment</link>
    <guid isPermaLink="false">urn:md5:5b0d1f6c2a1c7ef82b8ab910d37ea520</guid>
    <pubDate>Tue, 11 Dec 2007 22:40:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category>    
    <description>    &lt;ul&gt;
&lt;li&gt;Le livre &amp;quot;&lt;a href=&quot;http://www.apress.com/book/view/1590597257&quot; hreflang=&quot;en&quot;&gt;The Definitive Guide to Django: Web Development Done Right&lt;/a&gt;&amp;quot;, rédigé par deux des principaux contributeurs au framework &lt;a href=&quot;http://www.djangoproject.com&quot; hreflang=&quot;en&quot;&gt;django&lt;/a&gt; est sorti. Je l'ai commandé, j'ai pas su/pu résister &lt;img src=&quot;/themes/default/smilies/laugh.png&quot; alt=&quot;:-D&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blogcosm.com/media/blogmaker/release/README.html&quot; hreflang=&quot;en&quot;&gt;Blogmarker&lt;/a&gt;, une application de blog en django et qui a l'air pas mal du tout... si vous l'utilisez pas en tant que tel, le code doit pouvoir être source d'inspiration &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.playgroundblues.com/posts/2007/dec/02/django-basic-apps/&quot; hreflang=&quot;en&quot;&gt;Django Basic Apps&lt;/a&gt;,un ensemble d'applications basiques (blog, collection, lieu, etc) sont mises à disposition. Toujours utile en tant que tel ou pour leur code&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/django-registration/&quot; hreflang=&quot;en&quot;&gt;django-registration&lt;/a&gt; et &lt;a href=&quot;http://code.google.com/p/django-template-utils/&quot; hreflang=&quot;en&quot;&gt;template-utils&lt;/a&gt; viennent de passer en 0.4. Parmi les &lt;a href=&quot;http://www.b-list.org/weblog/2007/dec/09/updates/&quot; hreflang=&quot;en&quot;&gt;nouveautés&lt;/a&gt;, le plus intéressant est l'inclusion de &lt;a href=&quot;http://www.feedparser.org&quot; hreflang=&quot;en&quot;&gt;FeeeParser&lt;/a&gt; dans template_utils...&lt;/li&gt;
&lt;li&gt;Discussion sur la &lt;a href=&quot;http://groups.google.com/group/django-developers/browse_thread/thread/b4c237ad76f9eeca&quot; hreflang=&quot;en&quot;&gt;liste des fonctionnalités de Django 1.0&lt;/a&gt; - Miam &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Pour appréhender newforms, rien de tel que ce billet en trois parties de James Bennett : &lt;a href=&quot;http://www.b-list.org/weblog/2007/nov/22/newforms/&quot; hreflang=&quot;en&quot;&gt;Partie 1&lt;/a&gt;, &lt;a href=&quot;http://www.b-list.org/weblog/2007/nov/23/newforms/&quot; hreflang=&quot;en&quot;&gt;Partie 2&lt;/a&gt;, &lt;a href=&quot;http://www.b-list.org/weblog/2007/nov/25/newforms/&quot; hreflang=&quot;en&quot;&gt;Partie 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;et sans oublier &lt;a href=&quot;http://code.google.com/p/django-profiles/&quot; hreflang=&quot;en&quot;&gt;django-profiles&lt;/a&gt; ou encore &lt;a href=&quot;http://code.google.com/p/coltrane-blog/&quot; hreflang=&quot;en&quot;&gt;le code du blog de James Bennett&lt;/a&gt; qui peuvent être intéressant &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y a eu pas mal de choses d'intéressant ces derniers temps sur Django, c'était un &amp;quot;morceau choisi&amp;quot;. Tout le reste est sur mon &lt;a href=&quot;http://del.icio.us/nicolassteinmetz/django&quot; hreflang=&quot;en&quot;&gt;tag &amp;quot;django&amp;quot; sur del.icio.us&lt;/a&gt;...&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django : activer l'autocomplétion dans votre console</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/11/30/Django-%3A-activer-lautocompletion-dans-votre-console</link>
    <guid isPermaLink="false">urn:md5:1ce9b3f4f6fc4bfdb7d1e24a86557b5e</guid>
    <pubDate>Fri, 30 Nov 2007 19:09:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>autocomplétion</category><category>console</category><category>django</category>    
    <description>    &lt;p&gt;Utilisant la version de développement (svn) de &lt;a href=&quot;http://www.djangoproject.com&quot; hreflang=&quot;en&quot;&gt;Django&lt;/a&gt;, j'ai farfouillé dans le contenu du répertoire &lt;a href=&quot;http://code.djangoproject.com/browser/django/trunk/extras&quot;&gt;extras&lt;/a&gt; de django et on y trouve un symathique fichier &lt;a href=&quot;http://code.djangoproject.com/browser/django/trunk/extras/django_bash_completion&quot;&gt;django_bash_completion&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Il vous suffit de placer ce fichier dans &lt;code&gt;/etc/bash_completion.d/&lt;/code&gt; (ou de faire un lien symbolique, ce qui peut être pratique si le fichier est mis à jour et si vous suivez régulièrement la version de développement).&lt;/p&gt;


&lt;p&gt;Pour profiter de cette complétion suivant votre distribution GNU/Linux et où l'autocomplétion est définie :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;source&lt;/span&gt; /etc/profile
&amp;nbsp;
et/ou :
&amp;nbsp;
&lt;span style=&quot;color: #000066;&quot;&gt;source&lt;/span&gt; ~/.bashrc&lt;/pre&gt;


&lt;p&gt;Ensuite, à la racine de votre projet django, faites :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;python manage.py &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;Tab&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;Tab&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;et toutes les options possibles vont apparaître :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;$ python manage.py
adminindex        loaddata          sqlclear          startproject
createcachetable  reset             sqlcustom         syncdb
dbshell           runfcgi           sqlflush          &lt;span style=&quot;color: #000066;&quot;&gt;test&lt;/span&gt;
diffsettings      runserver         sqlindexes        validate
dumpdata          shell             sqlreset
flush             sql               sqlsequencereset
inspectdb         sqlall            startapp&lt;/pre&gt;


&lt;p&gt;Toujours ça de pris &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Pygments et ReST (partie 2 sur je-sais-pas-combien-encore)</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/11/18/Pygments-et-ReST-partie-2-sur-je-sais-pas-combien-encore</link>
    <guid isPermaLink="false">urn:md5:8ff238f874c1333d54fe7fe8ec017a95</guid>
    <pubDate>Sun, 18 Nov 2007 23:27:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>coloration syntaxique</category><category>docutils</category><category>pygments</category><category>python</category><category>ReST</category>    
    <description>    &lt;p&gt;Suite de mon aventure sur &lt;a href=&quot;http://www.unelectronlibre.info/index.php/post/2007/11/18/Pygments-et-ReST-partie-1-sur-je-sais-pas-combien-encore&quot; hreflang=&quot;fr&quot;&gt;Pygments et ReST&lt;/a&gt; :&lt;/p&gt;


&lt;p&gt;En lisant la &lt;a href=&quot;http://pygments.org/docs/quickstart/&quot; hreflang=&quot;en&quot;&gt;documentation rapide (QuickStart) de Pygments&lt;/a&gt;, on trouve comment récupérer la feuille de style fournit par défaut :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;pygmentize -S default -f html &amp;gt; style.&lt;span style=&quot;color: black;&quot;&gt;css&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ensuite, lors de la transformation Rest vers HTML, il suffit de faire :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;rst2html.&lt;span style=&quot;color: black;&quot;&gt;py&lt;/span&gt; source.&lt;span style=&quot;color: black;&quot;&gt;txt&lt;/span&gt; cible.&lt;span style=&quot;color: black;&quot;&gt;html&lt;/span&gt; --stylesheet-path=style.&lt;span style=&quot;color: black;&quot;&gt;css&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Il y a surement plus propre mais bon, ça marche... Cela veut aussi et surtout dire que pour produire un site à partir de document s au format ReST, il faut construire sa feuille de style CSS en incluant celle de pygments notamment.&lt;/p&gt;


&lt;p&gt;Et voilà le résultat :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2284/2044261987_0abe6796c5.jpg&quot; alt=&quot;ReST et Pygments&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://flickr.com/photos/nicolas-steinmetz/2044261987/&quot;&gt;Voir la capture d'écran&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Pygments et ReST (partie 1 sur je-sais-pas-combien-encore)</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/11/18/Pygments-et-ReST-partie-1-sur-je-sais-pas-combien-encore</link>
    <guid isPermaLink="false">urn:md5:e3fb8cb317309d31f6fe682cce14c1d3</guid>
    <pubDate>Sun, 18 Nov 2007 23:00:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>coloration syntaxique</category><category>docutils</category><category>pygments</category><category>python</category><category>ReST</category>    
    <description>    &lt;p&gt;Dans le monde python, il y a :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une syntaxe de documentation puissante mais pas aisée à prendre en main : ReST, pour ReStructured Text, fourni via &lt;a href=&quot;http://docutils.sourceforge.net/docs/index.html&quot; hreflang=&quot;en&quot;&gt;docutils&lt;/a&gt;. Voir la &lt;a href=&quot;http://docutils.sourceforge.net/docs/user/rst/quickref.html&quot; hreflang=&quot;en&quot;&gt;QuickRef de ReST&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pygments.org&quot; hreflang=&quot;en&quot;&gt;Pygments&lt;/a&gt;, un système de coloration syntaxique, un peu comme &lt;a href=&quot;http://qbnz.com/highlighter/&quot; hreflang=&quot;en&quot;&gt;GeSHi&lt;/a&gt; en PHP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans vos documents rédigés en ReST, il est possible d'inclure Pygments pour enrichir le rendu de vos documents.&lt;/p&gt;


&lt;p&gt;Il vous faut pour cela :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;docutils installé sur votre ordinateur,&lt;/li&gt;
&lt;li&gt;pygments aussi&lt;/li&gt;
&lt;li&gt;récupéré le fichier &lt;code&gt;external/rst-directive.py&lt;/code&gt; présent dans le fichier source de pygments 0.9 et le copier dans &lt;code&gt;/usr/lib/python2.5/site-packages/docutils/parsers/rst/directives/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensuite, et c'est là où le système manque un peu de flexibilité, il faut déclarer cette directive :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Editer &lt;code&gt;/usr/lib/python2.5/site-packages/docutils/parsers/rst/directives/&lt;strong&gt;init&lt;/strong&gt;.py&lt;/code&gt; (il y a deux &amp;quot;_&amp;quot; de chaque coté du init - bug de DC2 apparemment) pour ajouter une ligne :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot;&gt;_directive_registry = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;
      &lt;span style=&quot;color: #483d8b;&quot;&gt;'sourcecode'&lt;/span&gt;: &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'rst-directive'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'pygments_directive'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
      &lt;span style=&quot;color: #483d8b;&quot;&gt;'attention'&lt;/span&gt;: &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'admonitions'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'Attention'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
      ...
      &lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Cette déclaration dit que quand j'utiliserais la directive &lt;code&gt;sourcecode&lt;/code&gt; dans mon document ReST, alors il doit aller utiliser la classe &lt;code&gt;pygments_directive&lt;/code&gt; présente dans le fichier &lt;code&gt;rst-directive.py&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Editer le fichier &lt;code&gt;/usr/lib/python2.5/site-packages/docutils/parsers/rst/languages/en.py&lt;/code&gt; (et les éventuelles traductions) :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot;&gt;directives = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;
      &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# language-dependent: fixed&lt;/span&gt;
      &lt;span style=&quot;color: #483d8b;&quot;&gt;'sourcecode'&lt;/span&gt;: &lt;span style=&quot;color: #483d8b;&quot;&gt;'sourcecode'&lt;/span&gt;,
      &lt;span style=&quot;color: #483d8b;&quot;&gt;'attention'&lt;/span&gt;: &lt;span style=&quot;color: #483d8b;&quot;&gt;'attention'&lt;/span&gt;,
      ...
      &lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Voilà pour l'installation de pygments et docutils.&lt;/p&gt;


&lt;p&gt;Dans votre texte au format ReST, il vous suffit d'utiliser la directive &lt;code&gt;sourcecode&lt;/code&gt; comme dans l'exemple suivant :&lt;/p&gt;

&lt;pre&gt;
Tutoriel : partie 1
===================

settings.py
-----------

.. sourcecode:: python

    # Django settings for tutoriel project.

    DEBUG = True
    TEMPLATE_DEBUG = DEBUG

    ADMINS = (
        # ('Your Name', 'your_email@domain.com'),
    )
&lt;/pre&gt;


&lt;p&gt;Si vous voulez que les numéros de lignes soient également mentionnés, il vous faut décommenter la ligne suivante (dans &lt;code&gt;rst-directives.py&lt;/code&gt;) :&lt;/p&gt;


&lt;p&gt;et modifier votre fichier de la façon suivante (ajout de la directive &lt;code&gt;:linenos:&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;
Tutoriel : partie 1
===================

settings.py
-----------

.. sourcecode:: python
    :linenos:

    # Django settings for tutoriel project.

    DEBUG = True
    TEMPLATE_DEBUG = DEBUG

    ADMINS = (
        # ('Your Name', 'your_email@domain.com'),
    )
&lt;/pre&gt;


&lt;p&gt;Je vous fais grâce du code html de rendu, &lt;del&gt;surtout que pour le moment, je n'ai pas de coloration syntaxique&lt;/del&gt; (cf &lt;a href=&quot;http://www.unelectronlibre.info/index.php/post/2007/11/18/Pygments-et-ReST-partie-2-sur-je-sais-pas-combien-encore&quot; hreflang=&quot;fr&quot;&gt;Pygments et ReST Partie 2&lt;/a&gt;)&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django : internationaliser vos modèles dans vos applications</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/11/15/Django-%3A-internationaliser-vos-modeles-dans-vos-applications</link>
    <guid isPermaLink="false">urn:md5:1e53458bad353804f0d2fc1005c68021</guid>
    <pubDate>Thu, 15 Nov 2007 12:34:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>i18n</category>    
    <description>    &lt;p&gt;La documentation sur l'internationalisation d'une application Django m'ayant laissé perplexe tant en &lt;a href=&quot;http://www.djangoproject.com/documentation/i18n/&quot; hreflang=&quot;en&quot;&gt;anglais&lt;/a&gt; qu'en &lt;a href=&quot;http://trac.django-fr.org/browser/docs/trunk/i18n.txt&quot; hreflang=&quot;fr&quot;&gt;français&lt;/a&gt;, voici un petit résumé de ce qu'il faut faire.&lt;/p&gt;


&lt;p&gt;Dans &lt;code&gt;settings.py&lt;/code&gt;, il vous faut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoir un language code correctement configuré&lt;/li&gt;
&lt;li&gt;Que USE_I18N soit bien activé - c'est le cas par défaut&lt;/li&gt;
&lt;li&gt;Ajouter &lt;code&gt;'django.middleware.locale.LocaleMiddleware'&lt;/code&gt;, à la liste de vos middleware. Attention l'ordre compte - cf &lt;a href=&quot;http://www.djangoproject.com/documentation/i18n/#how-django-discovers-language-preference&quot; hreflang=&quot;en&quot;&gt;documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemple :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
&amp;nbsp;
LANGUAGE_CODE = &lt;span style=&quot;color: #483d8b;&quot;&gt;'fr'&lt;/span&gt;
&amp;nbsp;
USE_I18N = &lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
&amp;nbsp;
MIDDLEWARE_CLASSES = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;
    &lt;span style=&quot;color: #483d8b;&quot;&gt;'django.middleware.common.CommonMiddleware'&lt;/span&gt;,
    &lt;span style=&quot;color: #483d8b;&quot;&gt;'django.contrib.sessions.middleware.SessionMiddleware'&lt;/span&gt;,
    &lt;span style=&quot;color: #483d8b;&quot;&gt;'django.middleware.locale.LocaleMiddleware'&lt;/span&gt;,
    &lt;span style=&quot;color: #483d8b;&quot;&gt;'django.contrib.auth.middleware.AuthenticationMiddleware'&lt;/span&gt;,
    &lt;span style=&quot;color: #483d8b;&quot;&gt;'django.middleware.doc.XViewMiddleware'&lt;/span&gt;,
&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans &lt;code&gt;app/models.py&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Importer &lt;code&gt;gettext_lazy&lt;/code&gt; fourni par django. &lt;code&gt;gettext_lazy()&lt;/code&gt; s'utlise pour traduire les champs des modèles&lt;/li&gt;
&lt;li&gt;Pour éviter d'écrire &lt;code&gt;gettext_lazy('Single')&lt;/code&gt;, on peut utiliser le système d'alias pour n'écrire que : &lt;code&gt;_('Single')&lt;/code&gt; .&lt;/li&gt;
&lt;li&gt;Si vous êtes en unicode, c'est &lt;code&gt;ugettext_lazy()&lt;/code&gt; et non &lt;code&gt;gettext_lazy()&lt;/code&gt; bien sûr,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemple :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; django.&lt;span style=&quot;color: black;&quot;&gt;db&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; models
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; django.&lt;span style=&quot;color: black;&quot;&gt;contrib&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;auth&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;models&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;User&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; django.&lt;span style=&quot;color: black;&quot;&gt;utils&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;translation&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; ugettext_lazy as _
&amp;nbsp;
&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;
Profile
&amp;nbsp;
This object is used to provide some common information regarding the profile of a user.
&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;Profile&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;Model&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    CIVILITY_CHOICES = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;
         &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'single'&lt;/span&gt;, _&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Single'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
         &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'taken'&lt;/span&gt;, _&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Taken'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
    &lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    who = models.&lt;span style=&quot;color: black;&quot;&gt;ForeignKey&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #dc143c;&quot;&gt;User&lt;/span&gt;, unique=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;, verbose_name=_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Person'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    photo = models.&lt;span style=&quot;color: black;&quot;&gt;ImageField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;height_field=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;80&amp;quot;&lt;/span&gt;, width_field=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;80&amp;quot;&lt;/span&gt;, upload_to=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;photos&amp;quot;&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    street = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Address 1'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, maxlength=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    street_bis = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Address 2'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, maxlength=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    zipcode = models.&lt;span style=&quot;color: black;&quot;&gt;IntegerField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Zip code'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, maxlength=&lt;span style=&quot;color: #ff4500;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    city = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'City'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, maxlength=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    phone = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Phone'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, maxlength=&lt;span style=&quot;color: #ff4500;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    mobile = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Mobile'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, maxlength=&lt;span style=&quot;color: #ff4500;&quot;&gt;20&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    civility = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Status'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, maxlength=&lt;span style=&quot;color: #ff4500;&quot;&gt;20&lt;/span&gt;, choices=CIVILITY_CHOICES&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    birthdate = models.&lt;span style=&quot;color: black;&quot;&gt;DateField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Birth date'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    children = models.&lt;span style=&quot;color: black;&quot;&gt;IntegerField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;_&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Children'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;, null=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans le répertoire de votre application, créer un répertoire &amp;quot;locale&amp;quot; :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;mkdir -p /chemin/de/votre/projet/django/app/locale&lt;/pre&gt;


&lt;p&gt;Ensuite il vous faut générer votre fichier de langue .po correspondant à votre langue (ici : fr):&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;/usr/lib/python2&lt;span style=&quot;color: #ff4500;&quot;&gt;.5&lt;/span&gt;/site-packages/django/bin/make-messages -l fr&lt;/pre&gt;


&lt;p&gt;Saisissez alors la traduction dans &lt;code&gt;app/locale/&amp;lt;langue&amp;gt;/LC_MESSAGES/django.po&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;Exemple :&lt;/p&gt;

&lt;pre&gt;
#: models.py:14
msgid &amp;quot;Single&amp;quot;
msgstr &amp;quot;Célibataire&amp;quot;
&lt;/pre&gt;


&lt;p&gt;Compiler ensuite votre fichier de langue :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;/usr/lib/python2&lt;span style=&quot;color: #ff4500;&quot;&gt;.5&lt;/span&gt;/site-packages/django/bin/compile-messages&lt;/pre&gt;


&lt;p&gt;Vous obtenez alors un fichier &lt;code&gt;app/locale/&amp;lt;langue&amp;gt;/LC_MESSAGES/django.mo&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;Dans votre template :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ajouter &lt;code&gt;{% load i18n %}&lt;/code&gt; en tête de template&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ex :&lt;/p&gt;

&lt;pre&gt;
{% extends &amp;quot;base.html&amp;quot; %}
{% load markup %}
{% load i18n %}
&lt;/pre&gt;


&lt;p&gt;Si vous utilisez le serveur de développement, il faut le redémarrer pour qu'il prenne en compte les fichiers de langue compilés (idem lors d'une mise à jour des fichiers de langue).&lt;/p&gt;


&lt;p&gt;Et voilà, savourez le travail...&lt;/p&gt;


&lt;p&gt;Merci à benoitc et anhj de #django-fr pour m'avoir aidé à trouver mon erreur (ie avoir créer dans le répertoire de mon application une structure &lt;code&gt;conf/locale&lt;/code&gt; au lieu de &lt;code&gt;locale&lt;/code&gt;. La première ne s'utilise que pour l'ensemble d'un projet django).&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django : utilisation de regroup avec tri sur des clés étrangères</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/09/15/Django-%3A-utilisation-de-regroup-avec-tri-sur-des-cles-etrangeres</link>
    <guid isPermaLink="false">urn:md5:20dca43af0b5e0ce95035a0741b6055f</guid>
    <pubDate>Sun, 16 Sep 2007 14:11:00 +0200</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>clé étrangère</category><category>django</category><category>regroup</category>    
    <description>    &lt;p&gt;&lt;strong&gt;Objectif :&lt;/strong&gt; Utilise la balise &amp;quot;&lt;a href=&quot;http://www.djangoproject.com/documentation/templates/#regroup&quot;&gt;regroup&lt;/a&gt;&amp;quot; en filtrant sur une clé étrangère&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Modèle :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Soit le modèle suivant :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;
Technicat skills
&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;class&lt;/span&gt; DomainTechSkill&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;Model&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
     name = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Domaine de compétence technique'&lt;/span&gt;, Maxlength=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;, core=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;class&lt;/span&gt; Techskill&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;Model&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
     who = models.&lt;span style=&quot;color: black;&quot;&gt;ForeignKey&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #dc143c;&quot;&gt;User&lt;/span&gt;, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;'Personne'&lt;/span&gt;,&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
     name = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Compétences techniques'&lt;/span&gt;, maxlength=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;, core=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
     domain = models.&lt;span style=&quot;color: black;&quot;&gt;ForeignKey&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;DomainTechSkill, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;'Domaine de compétences techniques'&lt;/span&gt;,&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;class&lt;/span&gt; Usertechskill&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;Model&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
     who = models.&lt;span style=&quot;color: black;&quot;&gt;ForeignKey&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #dc143c;&quot;&gt;User&lt;/span&gt;, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;'Personne'&lt;/span&gt;,&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
     name = models.&lt;span style=&quot;color: black;&quot;&gt;ManyToManyField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Techskill, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;'Compétence technique'&lt;/span&gt;, filter_interface=models.&lt;span style=&quot;color: black;&quot;&gt;HORIZONTAL&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;L'idée est de faire d'une part TechSkill &amp;lt;=&amp;gt;DomainTechSkill et d'autre part User &amp;lt;=&amp;gt; TechSkill. Ensuite au niveau de la restitution, on veut lister les compétences techniques d'un utilisateur en les regroupant par &amp;quot;DomainTechSkill&amp;quot;.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Vue :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;avec la vue suivante (extrait) :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;def&lt;/span&gt; cv_detail&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;request, firstname, lastname&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
     &lt;span style=&quot;color: #dc143c;&quot;&gt;user&lt;/span&gt; = &lt;span style=&quot;color: #dc143c;&quot;&gt;User&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;objects&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;first_name=firstname, last_name=lastname&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
     user_techskill = &lt;span style=&quot;color: #dc143c;&quot;&gt;user&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;usertechskill_set&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
     &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;return&lt;/span&gt; render_to_response&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'cv/cv_detail.html'&lt;/span&gt;, &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'user_techskill'&lt;/span&gt;: user_techskill, &lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Template :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;et le template suivant (extrait) :&lt;/p&gt;

&lt;pre&gt;
                 {# -- technical skills -- #}
                 {% if user_techskill %}
                 &amp;lt;p&amp;gt;Comp&amp;amp;eacute;tences techniques :&amp;lt;/p&amp;gt;
                 {% for techskill in user_techskill %}
                 {% regroup techskill.name.all|dictsort:&amp;quot;domain&amp;quot; by domain as grouped %}
                 &amp;lt;ul&amp;gt;
                          {% for group in grouped %}
                                 &amp;lt;li&amp;gt; {{ group.grouper }} :
                                         {% for item in group.list %}
                                                 {{ item.name }}{% if forloop.last %}.{% else %},{% endif %}
                                         {% endfor %}
                                 &amp;lt;/li&amp;gt;
                          {% endfor %}
                 &amp;lt;/ul&amp;gt;
                 {% endfor %}
                 {% endif %}
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Jeux de données :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Imaginons que j'ai alors rentré les couples de valeur suivants (Compétence techniques / Domaine Technique) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML / Web&lt;/li&gt;
&lt;li&gt;CSS / Web&lt;/li&gt;
&lt;li&gt;Apache / Serveur&lt;/li&gt;
&lt;li&gt;Portail / Système d'information&lt;/li&gt;
&lt;li&gt;Bind / Serveur&lt;/li&gt;
&lt;li&gt;CMS / Système d'information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce qui est souhaité :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Serveur : Apache, Bind&lt;/li&gt;
&lt;li&gt;Système d'information : CMS, Portail&lt;/li&gt;
&lt;li&gt;Web : HTML, CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce qui est parfois obtenu (comme n'importe quelle autre combinaison de ces valeurs, ce qui nous permet d'avoir la bonne de temps à autre)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Serveur : Apache&lt;/li&gt;
&lt;li&gt;Système d'information : CMS, Portail&lt;/li&gt;
&lt;li&gt;Serveur : Bind&lt;/li&gt;
&lt;li&gt;Web : HTML, CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution pour avoir la bonne combinaison de façon systématique :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;La solution consiste dès lors à ajouter le nom de l'attribut (ex : domain.name) ou de filtrer par un id (ex : domain.id)&lt;/p&gt;

&lt;pre&gt;
                 {% regroup techskill.name.all|dictsort:&amp;quot;domain.name&amp;quot; by domain as grouped %}
&lt;/pre&gt;


&lt;p&gt;Et là, vous avez systématiquement le résultat souhaité (seul l'ordre des compétences peut varier sur une même ligne)&lt;/p&gt;


&lt;p&gt;Merci à Samuel pour m'avoir indiqué cette capacité.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django et les fixtures</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/09/15/Django-et-les-fixtures</link>
    <guid isPermaLink="false">urn:md5:b963f6a4c77bb7a123375489e77fe657</guid>
    <pubDate>Sat, 15 Sep 2007 09:40:00 +0200</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>fixture</category><category>mysql</category><category>sqlite</category>    
    <description>    &lt;h2&gt;Sauvegarder les données saisies dans une instance sous la forme de fixture :&lt;/h2&gt;


&lt;p&gt;Pour sauver &lt;strong&gt;toutes&lt;/strong&gt; les données de votre projet :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;python manage.&lt;span style=&quot;color: black;&quot;&gt;py&lt;/span&gt; dumpdata --indent=&lt;span style=&quot;color: #ff4500;&quot;&gt;4&lt;/span&gt; &amp;gt; initial_data.&lt;span style=&quot;color: black;&quot;&gt;json&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Note :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le --indent=4 permet que le fichier créé soit correctement indenté et plus facile à lire.&lt;/li&gt;
&lt;li&gt;par défaut, c'est exporté au format json&lt;/li&gt;
&lt;li&gt;en nommant votre fichier initial_data.* il sera chargé automatiquement par django lors d'un syncdb, reste ou sqlreset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour sauver les données d'une application nommée &amp;quot;monapp&amp;quot; :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;python manage.&lt;span style=&quot;color: black;&quot;&gt;py&lt;/span&gt; dumpdata --indent=&lt;span style=&quot;color: #ff4500;&quot;&gt;4&lt;/span&gt; monapp &amp;gt; initial_data.&lt;span style=&quot;color: black;&quot;&gt;json&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Attention, si vous voulez opérer un changement sur votre modèle, il faut faire le dump &lt;strong&gt;avant&lt;/strong&gt; de faire des modifications, sinon cela ne marche pas.&lt;/p&gt;


&lt;p&gt;Pour charger une fixture, il suffit de faire :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;python manage.&lt;span style=&quot;color: black;&quot;&gt;py&lt;/span&gt; loadata ma_fixture.&lt;span style=&quot;color: black;&quot;&gt;json&lt;/span&gt;&lt;/pre&gt;


&lt;h2&gt;Passer de sqlite à MySQL (ou autre) en ayant des caractères accentués :&lt;/h2&gt;


&lt;p&gt;Lors du passage de Sqlite à MySQL, j'ai eu le bug suivant avec les exports en json : tous mes caractères accentués étaient transformés en caractères spéciaux. Le seul moyen fut de passer par un export xml :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;python manage.&lt;span style=&quot;color: black;&quot;&gt;py&lt;/span&gt; dumpdata --format=&lt;span style=&quot;color: #dc143c;&quot;&gt;xml&lt;/span&gt; --indent=&lt;span style=&quot;color: #ff4500;&quot;&gt;4&lt;/span&gt; monapp &amp;gt; initial_data.&lt;span style=&quot;color: #dc143c;&quot;&gt;xml&lt;/span&gt;&lt;/pre&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django-fr, le site de la communauté francophone Django est (enfin) en ligne !</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/06/04/Django-fr-le-site-de-la-communaute-francophone-Django-est-enfin-en-ligne</link>
    <guid isPermaLink="false">urn:md5:96d64fdcf707411589f180af5974a68a</guid>
    <pubDate>Mon, 04 Jun 2007 15:24:00 +0200</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>django-fr</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://www.biologeek.com&quot; hreflang=&quot;fr&quot;&gt;David&lt;/a&gt; a su profiter de sa &lt;a href=&quot;http://larlet.fr/conferences/django/&quot;&gt;présentation du framework python Django&lt;/a&gt; lors des &lt;a href=&quot;http://journees.afpy.org/&quot; hreflang=&quot;fr&quot;&gt;journées francophones python&lt;/a&gt; (organisées par l'AFPy) pour mettre en ligne une première version du site &lt;a href=&quot;http://www.django-fr.org/&quot; hreflang=&quot;fr&quot;&gt;django-fr.org&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Vous allez donc pouvoir retrouver sur ce site :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la documentation traduite dans la langue de Molière,&lt;/li&gt;
&lt;li&gt;des liens utiles,&lt;/li&gt;
&lt;li&gt;le code du site en lui-même (qui peut toujours servir d'exemple ou de base pour un projet perso...),&lt;/li&gt;
&lt;li&gt;pleins de gentilles personnes via la liste et le canal irc #django-fr sur freenode.net &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Content de voir que le projet sort enfin, ça donne une réalité à ce serpent de mer dont on parle depuis des mois et ça devrait (re)motiver les troupes pour finaliser les traductions et apporter peut être un peu de sang neuf... &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django - gestion des caractères accentués dans les modèles</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/04/16/Django-gestion-des-caracteres-accentues-dans-les-modeles</link>
    <guid isPermaLink="false">urn:md5:7340c10b64a7ac84a664a1810b435697</guid>
    <pubDate>Mon, 16 Apr 2007 22:13:00 +0200</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>accents</category><category>django</category>    
    <description>    &lt;p&gt;Si vous avez qqc du genre :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;class&lt;/span&gt; Skill&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;Model&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    SKILL_LEVEL_CHOICES = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'beginner'&lt;/span&gt; : &lt;span style=&quot;color: #483d8b;&quot;&gt;'Débutant'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'intermediate'&lt;/span&gt; : &lt;span style=&quot;color: #483d8b;&quot;&gt;'Intermédiaire'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'advanced'&lt;/span&gt; : &lt;span style=&quot;color: #483d8b;&quot;&gt;'Avancé'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
    &lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    ...&lt;/pre&gt;


&lt;p&gt;et que lorsque vous utilisez :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;python manage.&lt;span style=&quot;color: black;&quot;&gt;py&lt;/span&gt; validate&lt;/pre&gt;


&lt;p&gt;vous avez une jolie erreur du type :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;mvmo.&lt;span style=&quot;color: black;&quot;&gt;cv&lt;/span&gt;: Non-ASCII character &lt;span style=&quot;color: #483d8b;&quot;&gt;'&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\x&lt;/span&gt;c3'&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;file&lt;/span&gt; /home/django/mvmo/../mvmo/cv/models.
&lt;span style=&quot;color: black;&quot;&gt;py&lt;/span&gt; on line &lt;span style=&quot;color: #ff4500;&quot;&gt;111&lt;/span&gt;, but no encoding declared; see http://www.&lt;span style=&quot;color: black;&quot;&gt;python&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;org&lt;/span&gt;/peps/pep&lt;span style=&quot;color: #ff4500;&quot;&gt;-026&lt;/span&gt;
&lt;span style=&quot;color: #ff4500;&quot;&gt;3&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;html&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; details &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;py&lt;/span&gt;, line &lt;span style=&quot;color: #ff4500;&quot;&gt;111&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Hé bien cela est du aux accents !&lt;/p&gt;


&lt;p&gt;Pour résoudre cette erreur, il vous suffit de placer en tête de votre fichier models.py :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# -*- coding: utf-8 -*- &lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Vous pouvez remplacer utf-8 par un autre jeu d'encodage : latin-1, iso-8859-15, iso-8859-1, ascii, etc.&lt;/p&gt;


&lt;p&gt;Et le tour est joué.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>1ère appli django en ligne : Les Steinmetz.Net</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/04/15/1ere-appli-django-en-ligne-%3A-Les-SteinmetzNet</link>
    <guid isPermaLink="false">urn:md5:3ec8743e6c8fb8b3dbfca988d6c7d1f5</guid>
    <pubDate>Sun, 15 Apr 2007 00:05:00 +0200</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category>    
    <description>    &lt;p&gt;C'est avec une certaine joie que j'ai le plaisir de vous annoncer que &lt;a href=&quot;http://www.lessteinmetz.net/&quot; hreflang=&quot;fr&quot;&gt;Les Steinmetz.Net&lt;/a&gt; a subi un rafraichissement de printemps et qu'il est surtout généré par le framework python &lt;a href=&quot;http://www.djangoproject.com&quot; hreflang=&quot;en&quot;&gt;Django&lt;/a&gt;, avec intégration des librairies &lt;a href=&quot;http://www.feedparser.org&quot; hreflang=&quot;en&quot;&gt;Feedparser&lt;/a&gt; pour la prise en charge des flux RSS et &lt;a href=&quot;http://code.google.com/p/flickrpy/&quot; hreflang=&quot;en&quot;&gt;Flickr.py&lt;/a&gt; pour s'interfacer avec l'API de Flickr.&lt;/p&gt;


&lt;p&gt;Le site en tant que tel n'a pas grand chose d'intéressant mais c'était l'occasion de se faire la main. Il fallait bien une petite étape pour m'encourager à continuer à jouer avec Django. La prochaine sera &lt;a href=&quot;http://chaudron.unelectronlibre.info/wiki/MvMo&quot; hreflang=&quot;fr&quot;&gt;MvMo&lt;/a&gt;, et ensuite Atome.&lt;/p&gt;


&lt;p&gt;Un grand merci à &lt;a href=&quot;http://www.biologeek.com&quot; hreflang=&quot;fr&quot;&gt;David&lt;/a&gt; et à &lt;a href=&quot;http://www.aozeo.com/blog/&quot; hreflang=&quot;fr&quot;&gt;Baptiste&lt;/a&gt; pour leur aide, leur patience à mon égard et pour avoir répondu à mes questions !! &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Pour ceux que cela intéresse, le code est &lt;a href=&quot;http://chaudron.unelectronlibre.info/browser/sites/lessteinmetz/www&quot; hreflang=&quot;fr&quot;&gt;là&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django : Surcharger les urls de vos applcations</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/03/03/Django-%3A-Surcharger-les-urls-de-vos-applcations</link>
    <guid isPermaLink="false">urn:md5:37c52553fa50aec479e990c3979fc2af</guid>
    <pubDate>Sat, 03 Mar 2007 23:37:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>get_absolute_url</category><category>urls</category>    
    <description>    &lt;p&gt;Il y a quelques jours, avec l'installation du &lt;a href=&quot;http://www.unelectronlibre.info/index.php/post/2007/02/26/Django-%3A-Installer-Cab-le-gestionnaire-de-snippets-made-by-django&quot; hreflang=&quot;fr&quot;&gt;dépôt de snippets &amp;quot;Cab&amp;quot;&lt;/a&gt;, je me suis retrouvé avec un problème fort ennuyeux.&lt;/p&gt;


&lt;p&gt;Le problème était le suivant : l'application cab a définit un certain nombre de motifs d'url non compatibles avec mon installation locale. Ainsi, mon dépot de snippets étant disponible à l'adresse &lt;a href=&quot;http://localhost:8000/snippets/&quot;&gt;http://localhost:8000/snippets/&lt;/a&gt;, il était tout naturel de penser avoir &lt;a href=&quot;http://localhost:8000/snippets/languages/python&quot;&gt;http://localhost:8000/snippets/languages/python&lt;/a&gt; pour avoir la page listant les snippets fait en python. Et bien non, l'auteur de Cab avait mis un schéma d'url différent, ce qui fait que cela me renvoyait sur &lt;a href=&quot;http://localhost:8000/languages/python&quot;&gt;http://localhost:8000/languages/python&lt;/a&gt; et m'affichait une belle erreur 404.&lt;/p&gt;


&lt;p&gt;Deux solutions s'offraient alors à moi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modifier la fonction &lt;code&gt;get_absolute_url&lt;/code&gt; définie dans l'application, ce que je ne voulais pas afin de pouvoir suivre les évolutions de Cab&lt;/li&gt;
&lt;li&gt;Avoir une autre solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pensant que c'était un bug, j'avais remonté l'info à l'auteur de l'application. Ce dernier l'a considéré comme un bug qu'il ne corrigera pas mais m'a dit que je pouvais soit modifier la valeur de la fonction, soit utiliser &lt;code&gt;ABSOLUTE_URL_OVERRIDES&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;J'ai donc consulté la documentation sur &lt;a href=&quot;http://www.djangoproject.com/documentation/settings/#absolute-url-overrides&quot; hreflang=&quot;en&quot;&gt;ABSOLUTE_URL_OVERRIDES&lt;/a&gt;. Cela explique qu'on peut simplement modifier la valeur de &lt;code&gt;get_absolute_url&lt;/code&gt; en donnant les nouvelles valeurs à utiliser. Génial ! Je rajoute donc dans mon fichier snippets/settings.py :&lt;/p&gt;

&lt;pre&gt;
ABSOLUTE_URL_OVERRIDES = {
    'cab.Language' : lambda o: &amp;quot;/snippets/languages/%s/&amp;quot; % o.slug,
}
&lt;/pre&gt;


&lt;p&gt;Pour rappel, la fonction initale &lt;code&gt;get_absolute_url&lt;/code&gt; de ma classe &amp;quot;Language&amp;quot; de l'application cab (ce qui explique le &amp;quot;cab.Language&amp;quot;) est :&lt;/p&gt;

&lt;pre&gt;
    def get_absolute_url(self):
        return &amp;quot;/languages/%s/&amp;quot; % self.slug
&lt;/pre&gt;


&lt;p&gt;Suite à ce changement, lorsque j'utilise la fonction &lt;code&gt;get_absolute_url&lt;/code&gt; de ma classe Language, je ne suis plus sensé avoir /languages/python mais /snippets/languages/python.&lt;/p&gt;


&lt;p&gt;Sauvé ! me dis-je. Et non, raté !&lt;/p&gt;


&lt;p&gt;Un petit bug sur la version de développement fait qu'en fait il faut mettre le nom de la classe en minuscule (voir &lt;a href=&quot;http://code.djangoproject.com/ticket/3646&quot; hreflang=&quot;en&quot;&gt;ticket #3646&lt;/a&gt;), ce qui me donne donc pour le moment :&lt;/p&gt;

&lt;pre&gt;
ABSOLUTE_URL_OVERRIDES = {
    'cab.language' : lambda o: &amp;quot;/snippets/languages/%s/&amp;quot; % o.slug,
}
&lt;/pre&gt;


&lt;p&gt;Mais bon, maintenant ça marche &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django : Installer &quot;Cab&quot;, le gestionnaire de snippets made by django</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/02/26/Django-%3A-Installer-Cab-le-gestionnaire-de-snippets-made-by-django</link>
    <guid isPermaLink="false">urn:md5:925c531132e663e83433a3fc89257367</guid>
    <pubDate>Tue, 27 Feb 2007 06:30:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>cab</category><category>django</category><category>django-registration</category><category>snippets</category>    
    <description>    &lt;p&gt;C'est assez simple :&lt;/p&gt;


&lt;p&gt;Créer un projet django (attention, il vous faut une version svn de django pour profiter de newforms absent de la version 0.95.* ; pour l'installation, voir &lt;a href=&quot;http://www.djangoproject.com/documentation/install/#installing-the-development-version&quot; hreflang=&quot;en&quot;&gt;la documentation officielle&lt;/a&gt; ou &lt;a href=&quot;http://www.unelectronlibre.info/index.php/post/2007/01/12/Django-installer-la-version-de-developpement&quot; hreflang=&quot;fr&quot;&gt;mon billet à ce sujet&lt;/a&gt;) :&lt;/p&gt;

&lt;pre&gt;
django-admin.py startproject snippets
&lt;/pre&gt;


&lt;p&gt;Récupérez la dernière version de &lt;a href=&quot;http://code.google.com/p/cab/&quot; hreflang=&quot;en&quot;&gt;Cab&lt;/a&gt; :&lt;/p&gt;

&lt;pre&gt;
svn checkout http://cab.googlecode.com/svn/trunk/ snippets/cab
&lt;/pre&gt;


&lt;p&gt;Récupérez la dernière version de &lt;a href=&quot;http://code.google.com/p/django-registration/&quot; hreflang=&quot;en&quot;&gt;Django-Registration&lt;/a&gt; qui gère la partie authentification de Cab :&lt;/p&gt;

&lt;pre&gt;
svn checkout http://django-registration.googlecode.com/svn/trunk/ snippets/registration
&lt;/pre&gt;



&lt;p&gt;Récupérez la dernière version de &lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=153041&quot; hreflang=&quot;en&quot;&gt;markdown&lt;/a&gt; et installez la :&lt;/p&gt;

&lt;pre&gt;
unzip markdown-1.6a.zip
cd markdown-1.6a
sudo python setup.py install
&lt;/pre&gt;


&lt;p&gt;Récupérez et installer la dernière version de &lt;a href=&quot;http://cheeseshop.python.org/pypi/Pygments/&quot; hreflang=&quot;en&quot;&gt;Pygments&lt;/a&gt; :&lt;/p&gt;

&lt;pre&gt;
tar xzf Pygments-0.7.1.tar.gz
cd  Pygments-0.7.1/
sudo python setup.py install
&lt;/pre&gt;


&lt;p&gt;Editez snippets/settings.py au niveau de la base de données, le fuseau horaire (Europe/Paris) et la langue (fr-fr) et ajoutez &amp;quot;snippets.cab&amp;quot;, &amp;quot;snippets.django-registration&amp;quot; et &amp;quot;django.contrib.admin&amp;quot; (pour bénéficier de l'interface d'admin de django), ainsi que &amp;quot;django.contrib.comments&amp;quot;, &amp;quot;django.contrib.feeds&amp;quot; et &amp;quot;django.contrib.markup&amp;quot; dans la liste des applications installées :&lt;/p&gt;

&lt;pre&gt;
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'snippets.cab',
    'snippets.registration',
    'django.contrib.admin',
    'django.contrib.comments',
    'django.contrib.markup',
    'django.contrib.syndication',
)
&lt;/pre&gt;


&lt;p&gt;Créer votre base de données :&lt;/p&gt;

&lt;pre&gt;
python manage syncdb
&lt;/pre&gt;


&lt;p&gt;Editez ensuite snippets/urls.py pour ajouter que toutes les urls en /snippets/ soient utilisées par &amp;quot;cab&amp;quot;  et /accounts/ par &amp;quot;django-registration&amp;quot; et décommentez la ligne de l'interface d'admin :&lt;/p&gt;

&lt;pre&gt;
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    # Example:
    # (r'^snippets/', include('snippets.foo.urls')),

    # Uncomment this for admin:
    (r'^admin/', include('django.contrib.admin.urls')),
    (r'^snippets/', include('snippets.cab.urls')),
    (r'^accounts/', include('snippets.registration.urls')),
)
&lt;/pre&gt;


&lt;p&gt;Créez un répertoire snippets/templates et éditez snippets/settings.py pour avoir :&lt;/p&gt;

&lt;pre&gt;
TEMPLATE_DIRS = (
    # Put strings here, like &amp;quot;/home/html/django_templates&amp;quot; or &amp;quot;C:/www/django/templates&amp;quot;.
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    &amp;quot;./templates&amp;quot;
)
&lt;/pre&gt;


&lt;p&gt;Créez un fichier snippets/templates/base.html et snippets/templates/base_user.html pour avoir un premier rendu (moche) :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;{% block title %} {% endblock %}&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
{% block content_header %} {% endblock %}

{% block main_content %} {% endblock %}
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Lancer le serveur embarqué :&lt;/p&gt;

&lt;pre&gt;
python manage.py runserver
&lt;/pre&gt;


&lt;p&gt;et rendez-vous sur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://localhost:8000/accounts/register&quot; title=&quot;http://localhost:8000/accounts/register&quot;&gt;http://localhost:8000/accounts/regi...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://localhost:8000/snippets/&quot; title=&quot;http://localhost:8000/snippets/&quot;&gt;http://localhost:8000/snippets/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour les autres urls à tester/voir, jetez un oeil à snippets/cab/urls.py et snippets/registration/urls.py &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;A l'heure où j'écris, il vous faudra créer pas mal de templates spécifiques requis par &amp;quot;cab&amp;quot; ou &amp;quot;django-registration&amp;quot;. J'ai fait la &lt;a href=&quot;http://code.google.com/p/cab/issues/detail?id=6&amp;amp;can=2&amp;amp;q=&quot; hreflang=&quot;en&quot;&gt;demande d'un template complet par défaut&lt;/a&gt;, j'espère être entendu... &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt; : pour le moment, je ne suis pas entendu - faudra monter son template soi-même...&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Edit2&lt;/strong&gt; : Ajout de django.contrib.comments &amp;amp; django.contrib.markup dans les applications à installer et du template base_user.html (copie de base.html)&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Edit3&lt;/strong&gt; : Ajout de &amp;quot;django.contrib.syndication&amp;quot; dans les applications à installer&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Djangoseries du matin...</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/02/26/Djangoseries-du-matin</link>
    <guid isPermaLink="false">urn:md5:a57fc0dd1c309266d48560dcf4f53acc</guid>
    <pubDate>Mon, 26 Feb 2007 08:42:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>authentification</category><category>django</category><category>snippets</category>    
    <description>    &lt;p&gt;Pour celles et ceux qui voudraient un dépôt de code (snippets) un peu comme les &lt;a href=&quot;http://www.symfony-project.com/snippets/&quot; hreflang=&quot;en&quot;&gt;snippets de Symfony&lt;/a&gt; ou &amp;quot;&lt;a href=&quot;http://snippets.prendreuncafe.com/&quot; hreflang=&quot;fr&quot;&gt;Les petits bouts de code à Niko&lt;/a&gt;&amp;quot; mais en &lt;a href=&quot;http://www.djangoproject.com&quot; hreflang=&quot;en&quot;&gt;Django&lt;/a&gt; en lieu et place de &lt;a href=&quot;http://www.symfony-project.com/&quot; hreflang=&quot;en&quot;&gt;Symfony&lt;/a&gt;, ils vont être ravis de l'annonce de la sortie de &lt;a href=&quot;http://www.djangosnippets.org/&quot; hreflang=&quot;en&quot;&gt;Django Snippets&lt;/a&gt; et du logiciel servant à faire tourner ce dépôt : &lt;a href=&quot;http://code.google.com/p/cab/&quot; hreflang=&quot;en&quot;&gt;Cab&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Toujours au passage, le module d'authentification a été sorti du projet cab et peut donc être réutilisé à outrance : &lt;a href=&quot;http://code.google.com/p/django-registration/&quot;&gt;Django-Registration&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Sinon, la version &lt;a href=&quot;http://groups.google.com/group/django-users/browse_thread/thread/287912177d469a64&quot;&gt;0.96 avec notamment les newforms et le framework de test&lt;/a&gt; devrait sortir d'ici peu.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django et les vues génériques : petit exemple de filtrage de contenu.</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/01/18/Django-et-les-vues-generiques-%3A-petit-exemple-de-filtrage-de-contenu</link>
    <guid isPermaLink="false">urn:md5:f8aa95142391fea819c4bb27607d75ad</guid>
    <pubDate>Thu, 18 Jan 2007 22:24:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>filtrage</category><category>generic views</category>    
    <description>    &lt;p&gt;Il y a un truc que je trouve bien dans &lt;a href=&quot;http://www.djangoproject.com&quot; hreflang=&quot;en&quot;&gt;Django&lt;/a&gt;, ce sont les &lt;a href=&quot;http://www.djangoproject.com/documentation/generic_views/&quot; hreflang=&quot;en&quot;&gt;vues génériques&lt;/a&gt;. Ce sont des fonctions qui permettent d'afficher une liste ou le détail d'objets de façon très simple, sans avoir à coder quoi que ce soit.&lt;/p&gt;


&lt;p&gt;Cependant, elles ont un petit inconvénient : par défaut, elles ne permettent pas de filtrer la liste de résultats selon un argument. C'est donc génial pour afficher tous les billets d'un blog ou un billet en détail mais pas pour les billets de la catégorie XYZ. J'en vois déjà certains raler (non pas de nom, c'est mal) . Et bien ils auraient tord, car on peut vite retrouver nos petits avec les vues génériques et un chouilla de dev autour.&lt;/p&gt;


&lt;p&gt;Il existe un très bon billet à ce sujet : &lt;a href=&quot;http://www.b-list.org/weblog/2006/11/16/django-tips-get-most-out-generic-views&quot; hreflang=&quot;en&quot;&gt;Django tips: get the most out of generic views&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Dans le cas présent, ce qui nous intéresse, c'est d'afficher tous les billets d'un blog portant le tag &amp;quot;XYZ&amp;quot; :&lt;/p&gt;


&lt;p&gt;Soit une appli de blog possédant le modèle suivant :&lt;/p&gt;

&lt;pre&gt;
class Tag(models.Model):
    name = models.CharField(maxlength=50)
    url = models.SlugField(prepopulate_from=(&amp;quot;name&amp;quot;,))

class Post(models.Model):
    author = models.ForeignKey(User)
    title = models.CharField(maxlength=50)
    summary = models.TextField(blank=True)
    message = models.TextField()
    tag = models.ManyToManyField(Tag, blank=True)
    url = models.SlugField(prepopulate_from=(&amp;quot;title&amp;quot;,))
&lt;/pre&gt;


&lt;p&gt;et la configuration d'url suivante :&lt;/p&gt;

&lt;pre&gt;
urlpatterns = patterns('',
   (r'^$', 'django.views.generic.list_detail.object_list', dict(queryset= Post.objects.all(),)),
   (r'^post/(?P&amp;lt;slug&amp;gt;[-\w]+)/$', 'django.views.generic.list_detail.object_detail', dict(queryset= Post.objects.all() , slug_field= 'url',)),
   (r'^tag/$', 'django.views.generic.list_detail.object_list', dict(queryset= Tag.objects.all(), )),
   (r'^tag/(?P&amp;lt;mytag&amp;gt;[-\w]+)/$', 'atomecms.blog.views.tag_detail'),
)
&lt;/pre&gt;


&lt;p&gt;ce qui nous intéresse surtout, c'est la règle suivant qui dit que toute url commençant par /tag/quelquechose doit être traiter par la vue &amp;quot;tag_detail&amp;quot; de l'application blog de mon projet atomecms :&lt;/p&gt;

&lt;pre&gt;
   (r'^tag/(?P&amp;lt;mytag&amp;gt;[-\w]+)/$', 'atomecms.blog.views.tag_detail'),
&lt;/pre&gt;


&lt;p&gt;dans le fichier views.py de mon application, il me suffit de définir la vue &amp;quot;tag_detail&amp;quot; dont le but est d'afficher la liste des billets portant le tag passé dans l'url :&lt;/p&gt;

&lt;pre&gt;
from atomecms.blog.models import Post, Tag
from django.views.generic.list_detail import object_list

# Display all post for a given tag
def tag_detail(request, mytag):
    whoistag = Tag.objects.get(url=mytag)
    postlist = whoistag.post_set.all()
    return object_list(request, queryset=postlist, template_name='blog/tag_detail.html', allow_empty = 'True',)
&lt;/pre&gt;


&lt;p&gt;Explications :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;J'ai besoin de manipuler les objets Post et Tag définis plus haut, je les importe donc,&lt;/li&gt;
&lt;li&gt;Comme je m'appuie sur les vues génériques, j'ai aussi besoin d'importer la fonction me retournant une liste d'objets&lt;/li&gt;
&lt;li&gt;whoistag me permet de récupérer les information du tag passé dans l'url en le matchant avec l'attribut &amp;quot;url&amp;quot; de mon modèle. Il me fait une sorte de lookup complet. J'obtiens ainsi l'id et le nom du tag.&lt;/li&gt;
&lt;li&gt;postlist me donne la liste des billets portant le tag passé dans l'url en me basant sur l'id du tag obtenu précédemment. J'avais écrit initialement la ligne suivante qui donne le même résultat mais est peut être plus compréhensible à savoir que postlist me donnait tous les billets ayant l'id du tag retenu.:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
    postlist = Post.objects.filter(tag=whoistag.id) 
&lt;/pre&gt;


&lt;p&gt;mais &lt;a href=&quot;http://www.biologeek.com/&quot;&gt;david&lt;/a&gt; me dit que c'est mieux ainsi et plus &amp;quot;django compliant&amp;quot;. En effet, après avoir regardé la &lt;a href=&quot;http://www.djangoproject.com/documentation/db_api/#related-objects&quot;&gt;doc sur l'api de la DB&lt;/a&gt;, on comprend mieux la raison d'être du &lt;code&gt;post_set&lt;/code&gt; et le raccourci que me fait faire david.&lt;/p&gt;


&lt;p&gt;et dans mon template, dans la zone dédié à cet effet, il me suffit d'ajouter :&lt;/p&gt;

&lt;pre&gt;
	{% for object in object_list %}
		&amp;lt;dl&amp;gt;
			&amp;lt;dt&amp;gt;{{object.title}}&amp;lt;/dt&amp;gt;
			&amp;lt;dd&amp;gt;{{object.summary}}&amp;lt;/dd&amp;gt;
		&amp;lt;/dl&amp;gt;
	{% endfor %}
&lt;/pre&gt;


&lt;p&gt;Explications :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ma vue me retourne un &lt;code&gt;object_list&lt;/code&gt; avec tout les billets répondant à la requête et fournit pour chaque billet, l'ensemble des champs de mon modèle post.&lt;/li&gt;
&lt;li&gt;je crée donc une boucle, qui parcourt mon objet &lt;code&gt;object_list&lt;/code&gt; et pour chaque item j'affiche le titre et le résumé de mon billet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et voila, il me suffit de me rendre sur &lt;a href=&quot;http://localhost:8000/blog/tag/xyz&quot; title=&quot;http://localhost:8000/blog/tag/xyz&quot;&gt;http://localhost:8000/blog/tag/xyz&lt;/a&gt; et ça marche ! J'ai l'affichage qui m'intéressait et le projet Atome vient de faire un grand bond en avant ! &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;edit : &lt;a href=&quot;http://www.prendreuncafe.com/&quot;&gt;Niko&lt;/a&gt;, c'est plus clair maintenant ?&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django - installer la version de développement</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/01/12/Django-installer-la-version-de-developpement</link>
    <guid isPermaLink="false">urn:md5:965bfa5c03c032689d672522311d56ad</guid>
    <pubDate>Fri, 12 Jan 2007 22:15:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>installation</category>    
    <description>    &lt;p&gt;Me remettant à &lt;a href=&quot;http://www.djangoproject.com&quot; hreflang=&quot;en&quot;&gt;django&lt;/a&gt; sur mon ordi perso, j'ai reparcouru la &lt;a href=&quot;http://www.djangoproject.com/documentation/install/&quot; hreflang=&quot;en&quot;&gt;doc d'install&lt;/a&gt; qui conseille de prendre la dernière version de développement. Allez soyons fou en ce vendredi soir !&lt;/p&gt;


&lt;p&gt;J'ai suivi bêtement les &lt;a href=&quot;http://www.djangoproject.com/documentation/install/#installing-the-development-version&quot; hreflang=&quot;en&quot;&gt;indications&lt;/a&gt; :&lt;/p&gt;

&lt;pre&gt;
svn co http://code.djangoproject.com/svn/django/trunk/ django_src
sudo ln -s `pwd`/django_src/django /usr/lib/python2.3/site-packages/django
&lt;/pre&gt;


&lt;p&gt;Par contre au lieu de copier &lt;code&gt;django_src/django/bin/django-admin.py&lt;/code&gt; dans /usr/local/bin, j'ai préféré faire un lien symbolique, ce qui me semble plus pertinent avec une version de dev (on sait jamais, ce binaire peut changer et je pourrais rater cette mise à jour).&lt;/p&gt;

&lt;pre&gt;
sudo ln -s `pwd`/django_src/django/bin/django-admin.py /usr/local/bin/django-admin.py
&lt;/pre&gt;


&lt;p&gt;Et voilà, c'est parti &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Edit : j'ai un seul petit souci, je n'arrive plus à avoir l'autocomplétion de django sous Eclipse - je sais pas si c'est du à la version de dev ou à la dernière version de pydev... sinon tout marche au poil &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django et les vues génériques - utilisation de extra_context</title>
    <link>http://www.unelectronlibre.info/index.php/post/2006/12/01/Django-et-les-vues-generiques-utilisation-de-extra_context</link>
    <guid isPermaLink="false">urn:md5:005b7bc686cdfa67525f36c0c31288f9</guid>
    <pubDate>Fri, 01 Dec 2006 22:46:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>documentation</category><category>vues génériques</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://www.djangoproject.com&quot; hreflang=&quot;en&quot;&gt;Django&lt;/a&gt; met à disposition les &lt;a href=&quot;http://www.djangoproject.com/documentation/generic_views/&quot; hreflang=&quot;en&quot;&gt;vues génériques&lt;/a&gt; pour faciliter la vie du programmeur pour les questions courantes (lister un ensemble d'objets, montrer le détail d'un objet, que ce soit sous la forme d'une simple liste, ou bien par des tris de date).&lt;/p&gt;


&lt;p&gt;Cette fonctionnalité est très pratique et permet de créer rapidement des pages. Dans ces vues génériques, on a parfois besoin d'afficher d'autres éléments et il faut bien caser les opérations nécessaires quelque part. C'est là qu'interviennent les &amp;quot;extra_context&amp;quot;.&lt;/p&gt;


&lt;p&gt;Reprenons une vue générique simple : si j'arrive sur http://www.domaine.tld/ je veux lister tous les billets d'un blog.&lt;/p&gt;


&lt;p&gt;Je vais avoir dans urls.py :&lt;/p&gt;

&lt;pre&gt;
from django.conf.urls.defaults import *
from blog.models import Post, Tag, Category

urlpatterns = patterns('django.views.generic.list_detail',
   (r'^$', 'object_list', dict(queryset= Post.objects.all(),)),
)
&lt;/pre&gt;


&lt;p&gt;et dans mon template :&lt;/p&gt;

&lt;pre&gt;
{% block centralcontent %}
	&amp;lt;h3&amp;gt;Derniers billets...&amp;lt;/h3&amp;gt;
	{% for object in object_list %}
	&amp;lt;div class=&amp;quot;post&amp;quot;&amp;gt;
		&amp;lt;h4&amp;gt;
			&amp;lt;a href=&amp;quot;{{ object.get_absolute_url }}&amp;quot; title=&amp;quot;{{ object.title }}&amp;quot;&amp;gt;{{ object.title }}&amp;lt;/a&amp;gt;
		&amp;lt;/h4&amp;gt;
		&amp;lt;p class=&amp;quot;post-info&amp;quot;&amp;gt;Rédigé le {{ object.pub_date|date:&amp;quot;d F Y à H:i&amp;quot; }}, dans
		{% for post_category in object.category.all %}
		 &amp;lt;a href=&amp;quot;{{ post_category.get_blog_absolute_url }}&amp;quot; title=&amp;quot;{{ post_category.name }}&amp;quot;&amp;gt;{{ post_category.name }}&amp;lt;/a&amp;gt;
		{% endfor %}
		&amp;lt;/p&amp;gt;
		&amp;lt;div class=&amp;quot;post-tag&amp;quot;&amp;gt;Tags :
			{% for post_tag in object.tag.all %}
			 &amp;lt;a href=&amp;quot;{{ post_tag.get_blog_absolute_url }}&amp;quot; title=&amp;quot;{{ post_tag.name }}&amp;quot;&amp;gt;{{ post_tag.name }}&amp;lt;/a&amp;gt;
			{% endfor %}
		&amp;lt;/div&amp;gt;
		&amp;lt;div class=&amp;quot;post-content&amp;quot;&amp;gt;{{ object.summary }}&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;
	{% endfor %}
{% endblock %}
&lt;/pre&gt;


&lt;p&gt;Imaginons un instant que je veuille ajouter sur ma page d'accueil la liste des tags et des catégories de mon blog. Je vais donc ajouter des éléments dans mon motif d'urls :&lt;/p&gt;

&lt;pre&gt;
from django.conf.urls.defaults import *
from blog.models import Post, Tag, Category


urlpatterns = patterns('django.views.generic.list_detail',
   (r'^$', 'object_list', dict(queryset= Post.objects.all(),extra_context={'all_tags': Tag.objects.all(), 'all_categories': Category.objects.all(), })),
)
&lt;/pre&gt;


&lt;p&gt;et dans mon template, j'aurais juste à ajouter :&lt;/p&gt;

&lt;pre&gt;
{% block rightcolumn %}
	{% if all_tags %}
	&amp;lt;h3&amp;gt;Tags&amp;lt;/h3&amp;gt;
	&amp;lt;ul&amp;gt;
	{% for tag in all_tags %}
		&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;{{ tag.name }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
	{% endfor %}
	&amp;lt;/ul&amp;gt;
	{% endif %}

	{% if all_categories %}
   	&amp;lt;h3&amp;gt;Categories&amp;lt;/h3&amp;gt;
   	&amp;lt;ul&amp;gt;
	{% for categories in all_categories %}
		&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;quot; title=&amp;quot;{{ categories.description }}&amp;quot;&amp;gt;{{ categories.name }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
	{% endfor %}
	&amp;lt;/dl&amp;gt;
	{% endif %}
{% endblock %}
&lt;/pre&gt;


&lt;p&gt;Et voilà, ma page d'accueil liste mes billets, et dans la colonne de droite la liste des tags et des catégories (s'il y en a).&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>