{"id":675,"date":"2010-06-20T16:15:26","date_gmt":"2010-06-20T14:15:26","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=675"},"modified":"2010-06-20T16:15:26","modified_gmt":"2010-06-20T14:15:26","slug":"django-improved-inlines-enrichissez-facilement-vos-contenus-et-ca-sans-payer-lisf","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2010\/06\/20\/django-improved-inlines-enrichissez-facilement-vos-contenus-et-ca-sans-payer-lisf\/","title":{"rendered":"Django-improved-inlines, enrichissez facilement vos contenus et \u00e7a, sans payer l&#8217;ISF"},"content":{"rendered":"<p>La pluie ayant d\u00e9cid\u00e9 d&#8217;\u00eatre l&#8217;invit\u00e9 surprise du week-end, j&#8217;ai donc une bonne excuse pour ne pas aller prendre des coups de soleil \u00e0 la plage mais rester bien tranquillement sur mon clavier. Autant donc en profiter pour vous parler de l&#8217;application django du mois, j&#8217;ai nomm\u00e9 django-improved-inlines. Oui, je sais, elle a un nom \u00e0 rallonge. Django-improved-inlines est en fait une version l\u00e9g\u00e8rement dop\u00e9 de django-inlines (d&#8217;o\u00f9 le improved) qui fait elle m\u00eame parti du package <a href=\"http:\/\/github.com\/nathanborror\/django-basic-apps\">django-basic-apps<\/a>. Oui je sais, \u00e7a commence \u00e0 faire un arbre g\u00e9n\u00e9alogique digne d&#8217;une s\u00e9rie am\u00e9ricaine (ou du tr\u00f4ne de fer).<\/p>\n<h1>1- O\u00f9 on le trouve, comment on l\u2019installe, tout \u00e7a quoi (et la doc)\u00a0?<\/h1>\n<p>Vous le trouverez sur sa page <a href=\"http:\/\/github.com\/issackelly\/django-improved-inlines\">github<\/a>. C&#8217;est d&#8217;ailleurs l\u00e0 que vous pourrez apprendre que cette sympathique petite app est une version modifi\u00e9e de l&#8217;app inlines de django-basic-apps.<\/p>\n<p>Pour l&#8217;installation deux m\u00e9thodes\u00a0:<br \/>\ndirectement en clonant le repository git de github<br \/>\navec un petit easy_install bien de chez nous.<\/p>\n<p>Attention, l&#8217;application pour fonctionner \u00e0 besoin de <a href=\"http:\/\/www.crummy.com\/software\/BeautifulSoup\/\">BeautifulSoup<\/a> mais l&#8217;installation par easy_install ne vous l&#8217;installera pas automatiquement. Un petit easy_install beautifulsoup sera donc de rigueur. Et oui.<\/p>\n<p>Quand \u00e0 la doc, elle tient dans un mouchoir de poche, \u00e0 savoir le fichier readme mais au vu de la simplicit\u00e9 de l&#8217;app, ce n&#8217;est pas vraiment d\u00e9rangeant.<\/p>\n<h1>2- Mais au fait, \u00e0 quoi \u00e7a sert\u00a0?<\/h1>\n<p>En fait c&#8217;est tout simple. Cela vous permet, lorsque vous r\u00e9digez des contenus, d&#8217;ins\u00e9rer \u00e0 l&#8217;int\u00e9rieur d&#8217;autre contenu g\u00e9rer par votre django. Et en les mettant en forme avec des templates sp\u00e9cifiques.<\/p>\n<p>Imaginons par exemple que vous voulez ins\u00e9rez des images d&#8217;une mani\u00e8re simple dans un billet de blog, ou des blocks de texte ou ce que vous voulez en fait. Et cela, sans modifier le template de votre contenu principal. Et oui. Mais non, ce n&#8217;est pas de la magie.<\/p>\n<h1>3- Comment \u00e7a marche\u00a0?<\/h1>\n<p>En fait, cela marche en deux temps. Tout d&#8217;abord dans le template d&#8217;affichage de votre contenu principal, il faut d\u00e9clarer et utiliser le template de django-improved-inlines, comme ceci\u00a0:<\/p>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\"><span class=\"br0\">&#123;<\/span>% load inlines %<span class=\"br0\">&#125;<\/span><br \/>\n\u2026....<br \/>\n<span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span> post.<span class=\"me1\">body<\/span>|render_inlines <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Ensuite, tout va se jouer dans votre contenu, ici le body de votre post. Vous allez parsemer celui si de bouts d&#8217;xml qui seront process par BeautifulSoup et Improved-Inlines et qui seront transform\u00e9s en html (gr\u00e2ce \u00e0 un template).<\/p>\n<p>L&#8217;exemple le plus simple est\u00a0:<\/p>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"xml codecolorer\"><span class=\"sc3\"><span class=\"re1\">&lt;inline<\/span> <span class=\"re0\">type<\/span>=<span class=\"st0\">&quot;media.photo&quot;<\/span> <span class=\"re0\">id<\/span>=<span class=\"st0\">&quot;1&quot;<\/span> <span class=\"re2\">\/&gt;<\/span><\/span><\/div><\/div>\n<p>qui affichera l&#8217;objet de pk 1 qui est mod\u00e9lis\u00e9 par la classe photo contenu dans l&#8217;app media.<\/p>\n<p>Mais vous pourrez \u00e9galement utiliser les attributs xml suivant\u00a0:<br \/>\nids pour afficher plusieurs id, s\u00e9par\u00e9es par des virgules.<br \/>\nfilter pour passer un filtre django<br \/>\ntemplate pour choisir le template django qui sera utilis\u00e9 (par d\u00e9fault l&#8217;app utilise inlines\/app_model.html)<br \/>\nclass qui permet de passer une class au template<\/p>\n<p>ce qui donnerait\u00a0:<\/p>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"xml codecolorer\"><span class=\"re1\">&lt;inline<\/span> <span class=\"re0\">type<\/span>=<span class=\"st0\">&quot;calendar.event&quot;<\/span> <span class=\"re0\">filter<\/span>=<span class=\"st0\">&quot;date__gte=datetime.date.today()&quot;<\/span> <span class=\"re0\">template<\/span>=<span class=\"st0\">&quot;calendar\/event_inline.html&quot;<\/span> <span class=\"re2\">\/&gt;<\/span><\/div><\/div>\n<p>ou encore\u00a0:<\/p>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"xml codecolorer\"><span class=\"re1\">&lt;inline<\/span> <span class=\"re0\">type<\/span>=<span class=\"st0\">&quot;app.model&quot;<\/span> <span class=\"re0\">id<\/span>=<span class=\"st0\">&quot;&lt;some pk&gt;&quot;<\/span><span class=\"re2\">\/&gt;<\/span> <span class=\"re1\">&lt;inline<\/span> <span class=\"re0\">type<\/span>=<span class=\"st0\">&quot;app.model&quot;<\/span> <span class=\"re0\">ids<\/span>=<span class=\"st0\">&quot;&lt;some pk&gt;,&lt;some other pk&gt;&quot;<\/span> <span class=\"re2\">\/&gt;<\/span><\/div><\/div>\n<h1>4-Conclusion<\/h1>\n<p>Je n&#8217;ai pas encore eu l&#8217;occasion de m&#8217;amuser, &#8216;pour de vrai&#8217; avec cette appli toute simple, ce n&#8217;est pas l&#8217;envie qui m&#8217;en manque parce que je pense lui trouver une foule d&#8217;application qui me faciliteront grandement la vie.<br \/>\nJ&#8217;ai une seule petite appr\u00e9hension que le process par BeautifulSoup ne ralentisse pas quelque peu le rendering des pages. Ca serait d&#8217;ailleurs un ralentissement \u00e0 \u00e9valuer. En tout cas, amusez vous bien avec cette appli aussi simple, qu&#8217;utile.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La pluie ayant d\u00e9cid\u00e9 d&#8217;\u00eatre l&#8217;invit\u00e9 surprise du week-end, j&#8217;ai donc une bonne excuse pour ne pas aller prendre des coups de soleil \u00e0 la plage mais rester bien tranquillement sur mon clavier. Autant donc en profiter pour vous parler de l&#8217;application django du mois, j&#8217;ai nomm\u00e9 django-improved-inlines. Oui, je sais, elle a un nom &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2010\/06\/20\/django-improved-inlines-enrichissez-facilement-vos-contenus-et-ca-sans-payer-lisf\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Django-improved-inlines, enrichissez facilement vos contenus et \u00e7a, sans payer l&#8217;ISF<\/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":[99,98,24],"class_list":["post-675","post","type-post","status-publish","format-standard","hentry","category-la-django-app-du-mois","tag-django","tag-python","tag-review"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-aT","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/675","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=675"}],"version-history":[{"count":3,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/675\/revisions"}],"predecessor-version":[{"id":678,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/675\/revisions\/678"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=675"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=675"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=675"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}