{"id":413,"date":"2010-01-31T18:23:09","date_gmt":"2010-01-31T17:23:09","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=413"},"modified":"2010-02-12T09:49:42","modified_gmt":"2010-02-12T08:49:42","slug":"tagcon-ou-comment-ecrire-simplement-les-templatetags-cong","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2010\/01\/31\/tagcon-ou-comment-ecrire-simplement-les-templatetags-cong\/","title":{"rendered":"Tagcon, o\u00f9 comment \u00e9crire simplement les templatetags, cong !!"},"content":{"rendered":"<p>Oui, je sais, je devrais renouveler un peu mon stock de blagues. Parce que mettre des cong \u00e0 la fin de tout et n&#8217;importe quoi, pour singer l&#8217;accent marseillais, \u00e7a commence \u00e0 &#8230;. Je sais. (j&#8217;en profite pour vous rappeler que le 24 et 25 avril, il va y avoir la <a title=\"Rencontre Django Fr\" href=\"http:\/\/rencontres.django-fr.org\/\">DjangoCong<\/a> \u00e0 Marseille, une super convention fr o\u00f9 \u00e7a va parler django, encore et encore).<\/p>\n<p>Et, oui, la django-app du mois de janvier arrive vraiment sur le fil, \u00e0 quelques heures du d\u00e9passement de d\u00e9lai. Mais faudra dire \u00e7a au cr\u00e9tin qui a d\u00e9cid\u00e9 qu&#8217;une journ\u00e9e \u00e7a ne serait que 24h et qu&#8217;il fallait obligatoirement dormir chaque nuit, ou presque \u2026 (bordeille comment je vais faire en f\u00e9vrier moi..)<\/p>\n<p>Enfin, je reste dans les d\u00e9lais, c&#8217;est le principal. Et pour le deuxi\u00e8me mois cons\u00e9cutif, je fais une petit entorse au principe de cette cat\u00e9gorie, vue que ce mois-ci, encore une fois, ce n&#8217;est pas une vrai django-app que je pr\u00e9sente, mais un &#8216;simple&#8217; module python.<\/p>\n<h1>0- Et \u00e7a sert \u00e0 quoi\u00a0 ?<\/h1>\n<p>En fait tagcon est &#8216;inutile&#8217; (donc indispensable vous allez me dire&#8230; ne niez pas, je vous ai tous entendu le dire&#8230;). Il sert simplement \u00e0 faciliter l&#8217;\u00e9criture des templatetags (et surtout des templates tags \u00e0 argument). On pourrait se dire que c&#8217;est assez inutile. Mais en fait, \u00e7a permet de gagner un peu de temps et de r\u00e9duire d&#8217;une fa\u00e7on assez int\u00e9ressante la taille de son code. Donc..<\/p>\n<p>Un petit exemple, tir\u00e9 de la doc, parce que comme me l&#8217;a fait remarquer daks (dont je conseille le <a href=\"http:\/\/blog.sietch-tabr.com\/\">blog<\/a>, qui vient d&#8217;arriver dans mes RSS) , \u00e7a manque :<\/p>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\"><span class=\"kw1\">from<\/span> django.<span class=\"me1\">contrib<\/span>.<span class=\"me1\">auth<\/span>.<span class=\"me1\">models<\/span> <span class=\"kw1\">import<\/span> User<br \/>\n<span class=\"kw1\">from<\/span> django.<span class=\"me1\">template<\/span> <span class=\"kw1\">import<\/span> Library<br \/>\n<span class=\"kw1\">import<\/span> tagcon<br \/>\n<br \/>\nregister <span class=\"sy0\">=<\/span> Library<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">class<\/span> UserListTag<span class=\"br0\">&#40;<\/span>tagcon.<span class=\"me1\">TemplateTag<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; limit <span class=\"sy0\">=<\/span> tagcon.<span class=\"me1\">IntegerArg<\/span><span class=\"br0\">&#40;<\/span>default<span class=\"sy0\">=<\/span><span class=\"nu0\">10<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">def<\/span> render<span class=\"br0\">&#40;<\/span><span class=\"kw2\">self<\/span><span class=\"sy0\">,<\/span> context<span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">self<\/span>.<span class=\"me1\">resolve<\/span><span class=\"br0\">&#40;<\/span>context<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">yield<\/span> <span class=\"st0\">&quot;&lt;ul&gt;&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"kw3\">user<\/span> <span class=\"kw1\">in<\/span> User.<span class=\"me1\">objects<\/span>.<span class=\"kw2\">all<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#91;<\/span>:<span class=\"kw2\">self<\/span>.<span class=\"me1\">args<\/span>.<span class=\"me1\">limit<\/span><span class=\"br0\">&#93;<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">yield<\/span> <span class=\"st0\">&quot;&lt;li&gt;%s&lt;\/li&gt;&quot;<\/span> % <span class=\"br0\">&#40;<\/span><span class=\"kw3\">user<\/span>.<span class=\"me1\">username<\/span><span class=\"sy0\">,<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">yield<\/span> <span class=\"st0\">&quot;&lt;\/ul&gt;&quot;<\/span><\/div><\/div>\n<h1>1- O\u00f9 on le trouve, comment on l\u2019installe, tout \u00e7a quoi ?<\/h1>\n<p>Alors alors, sur le <a title=\"github de tagcon\" href=\"http:\/\/github.com\/korpios\/django-tagcon\">github qui va bien<\/a>. (une petite remarque qui a rien \u00e0 voir, je pr\u00e9f\u00e8re de loin bitbucket \u00e0 github \u2026 et pas juste parce que mercurial c&#8217;est mieux que git).<\/p>\n<p>Une fois qu&#8217;on a r\u00e9cup\u00e9rer le package (par fork si on a un compte github ou avec un petit tar.gz), il y a deux fa\u00e7on de l&#8217;installer:<\/p>\n<ul>\n<li>un petit python setup.py install<\/li>\n<li>en copiant directement le fichier base.py qui se trouve dans tagcon.tagcon (dans ce cas l\u00e0 on pourra renommer base.py en tagcon.py).<\/li>\n<\/ul>\n<h1>2- La documentation.<\/h1>\n<p>Alors l\u00e0&#8230; Il n&#8217;y a pas grand chose. Un fichier readme qui donne un petit exemple et c&#8217;est tout. Apr\u00e8s, il vous faudra lire les tests et le fichier source directement. Ce n&#8217;est pas donc super fourni, mais d&#8217;un autre cot\u00e9, vous me direz que le module est tellement simple que \u00e7a suffit. Et vous ne seriez pas loin d&#8217;avoir raison. Mais bon.<\/p>\n<h1>3- En conclusion<\/h1>\n<p>Au d\u00e9part, quand j&#8217;ai d\u00e9couvert ce petit module (je crois que je dois, encore une fois, remercier <a title=\"benoitc on twitter\" href=\"http:\/\/twitter.com\/benoitc\">benoitc<\/a> pour cela), je n&#8217;\u00e9tais vraiment pas convaincu de son utilit\u00e9. Il me semblait presque inutile et puis un peu restrictif en obligeant \u00e0 utiliser la fonction render (alors que j&#8217;ai plus l&#8217;habitude d&#8217;enregistrer les fichier template html avec le d\u00e9corateur inclustion_tag). Mais au final, on se ren compte que \u00e7a simplifie pas mal les choses et on y prend rapidement go\u00fbt.<\/p>\n<h1>4- dernier paragraphe compl\u00e8tement HS.<\/h1>\n<p>Ma liste de django-app \u00e0 tester est loin d&#8217;\u00eatre vide (avec entre autre piston, haystack,..) et \u00e7a ne risque pas de changer, vu que chaque semaine, je d\u00e9couvre une nouvelle app. Toutefois, j&#8217;\u00e9cris ces billets avant tout pour qu&#8217;ils soient utile . Donc, si vous connaissez des app que vous adorez et que vous aimerez faire d\u00e9couvrir \u00e0 tous. Laissez moi leur nom en commentaire et je m&#8217;efforcerais de les tester.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oui, je sais, je devrais renouveler un peu mon stock de blagues. Parce que mettre des cong \u00e0 la fin de tout et n&#8217;importe quoi, pour singer l&#8217;accent marseillais, \u00e7a commence \u00e0 &#8230;. Je sais. (j&#8217;en profite pour vous rappeler que le 24 et 25 avril, il va y avoir la DjangoCong \u00e0 Marseille, une &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2010\/01\/31\/tagcon-ou-comment-ecrire-simplement-les-templatetags-cong\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Tagcon, o\u00f9 comment \u00e9crire simplement les templatetags, cong !!<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[35],"tags":[],"class_list":["post-413","post","type-post","status-publish","format-standard","hentry","category-la-django-app-du-mois"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-6F","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/comments?post=413"}],"version-history":[{"count":3,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/413\/revisions"}],"predecessor-version":[{"id":425,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/413\/revisions\/425"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}