{"id":154,"date":"2009-09-19T23:42:46","date_gmt":"2009-09-19T21:42:46","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=154"},"modified":"2009-10-04T22:24:01","modified_gmt":"2009-10-04T20:24:01","slug":"des-blocks-dans-des-blocks-dans-des-blocks-dans-des","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2009\/09\/19\/des-blocks-dans-des-blocks-dans-des-blocks-dans-des\/","title":{"rendered":"Des blocks dans des blocks dans des blocks , dans des &#8230;"},"content":{"rendered":"<p>Tout ceux qui font du django, ont, un jour, utilis\u00e9s des blocks pour \u00e9crire un template. Pour rappel, un block c&#8217;est un moyen de d\u00e9limiter un &#8217;bout&#8217; de template.<\/p>\n<h1>A quoi ca sert un block ? Tr\u00e8s rapide rappel<\/h1>\n<p>Imaginons que vous faites un blog. Votre blog peut afficher soit un post, soit une liste de post, soit une cat\u00e9gorie, soit une liste de cat\u00e9gorie. Dans tout les cas, vous aurez des menus \u00e0 droites et \u00e0 gauches et m\u00eame au dessus.<br \/>\nVous allez peut-\u00eatre d\u00e9cider de faire un template &#8216;base&#8217; o\u00f9 vous allez d\u00e9finir les choses qui ne changeront jamais, ici les menus.<br \/>\nEnsuite il faut trouver une fa\u00e7on simple de pouvoir soit afficher un post, soit une cat\u00e9gorie, etc etc ..<\/p>\n<p>Rien de plus simple. Dans la base vous d\u00e9finissez un block content par exemple :<\/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>% block content %<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span>% endblock %<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Maintenant dans votre template qui s&#8217;occupe d&#8217;afficher les posts, il suffira de dire que vous \u00e9tendez base puis de red\u00e9finir le block content et op, vous aurez \u00e0 la fois tout vos menus d\u00e9finis dans base mais aussi votre nouveau content.<\/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>% extends <span class=\"st0\">&quot;base.html&quot;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#123;<\/span>% block content %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span>post<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span>% endblock %<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Bien entendu, on est pas oblig\u00e9 de red\u00e9finir tout les blocks de template qu&#8217;on \u00e9tends. Si on ne red\u00e9finit pas un block , le contenu du block parent sera utilis\u00e9. (Par exemple, si on reprend l&#8217;id\u00e9e du blog, ce n&#8217;est pas seulement un block content qu&#8217;il faut d\u00e9finir, mais aussi un block pour chacun de nos menus. Ces block ne seront pas red\u00e9finis dans le template post, c&#8217;est donc ceux de base qui seront utilis\u00e9s)<\/p>\n<h1>des blocks dans des blocks.<\/h1>\n<p>Jusqu&#8217;\u00e0 pr\u00e9sent, je n&#8217;ai fait que faire un tr\u00e8s rapide rappel de ce que c&#8217;\u00e9tait qu&#8217;un block en django. (Pour ceux qui veulent en savoir plus, la doc de django est l\u00e0 pour \u00e7a).<\/p>\n<p>La petite astuce que je voulais mettre en lumi\u00e8re dans ce billet arrive maintenant. En fait c&#8217;est tout simple, c&#8217;est qu&#8217;on peut parfaitement imbriquer des blocks dans d&#8217;autre.<\/p>\n<p>Ceci :<\/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>% block content %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% block content_intra_content %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% endblock %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#123;<\/span>% endblock %<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Fonctionne parfaitement. A quoi cela pourrait servir ? Pourquoi ne pas faire deux blocks l&#8217;un en dessous de l&#8217;autre ?<\/p>\n<p>Pour la premi\u00e8re question, je me suis creus\u00e9 la t\u00eate pour trouver un exemple. Je crois en avoir trouv\u00e9 un. Imaginons qu&#8217;on doit afficher diff\u00e9rentes donn\u00e9es, toute de la m\u00eame mani\u00e8re. Mais que par contre , en fonction des donn\u00e9es en question , on a un menu &#8216;Actions possibles&#8217; diff\u00e9rents.<\/p>\n<p>Pour reprendre mon exemple de blog, cela serait afficher la liste des cat\u00e9gories ou la listes des posts.<\/p>\n<p>On pourrait donc d\u00e9cider de faire les choses ainsi\u00a0 dans le template liste :<\/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>% extends <span class=\"st0\">&quot;base.html&quot;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% block content %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% block actions\u00a0 %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#123;<\/span>% endblock %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% block content_intra_content %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Ici on affiche des trucs ...<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% endblock %<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span>% endblock %<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>puis dans le template liste_categorie :<\/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>% extends <span class=\"st0\">&quot;liste.html&quot;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% block actions\u00a0 %<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><span class=\"br0\">&#123;<\/span>categorie_actions<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>% endblock %<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Je ne suis pas sur que ce soit le meilleur exemple, ni m\u00eame qu&#8217;au final, l&#8217;imbrication des blocks aient une quelconque utilit\u00e9, mais comme en testant, je me suis rendu compte que c&#8217;\u00e9tait possible, je me suis dit que j&#8217;allais en parler (Et comme \u00e7a si des gens ont un avis sur l&#8217;utilit\u00e9 de cette pratique, je les aurais en commentaire)<\/p>\n<h1>Deux derniers petits trucs<\/h1>\n<p>Le tags {{ block.super }} qui permet dans un block fils de r\u00e9cup\u00e9rer le contenu d&#8217;un block p\u00e8re pour l&#8217;afficher. A utiliser quand on ne veut pas red\u00e9finir un block mais simplement l&#8217;enrichir.<br \/>\nIl est possible de remettre le nom du block dans le tags de fin de block comme ceci :<\/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>% extends <span class=\"st0\">&quot;base.html&quot;<\/span> %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#123;<\/span>% block content %<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#123;<\/span>% endblock content\u00a0 %<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Ca ne sert \u00e0 rien, \u00e0 part \u00e0 rendre plus clair les choses.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tout ceux qui font du django, ont, un jour, utilis\u00e9s des blocks pour \u00e9crire un template. Pour rappel, un block c&#8217;est un moyen de d\u00e9limiter un &#8217;bout&#8217; de template. A quoi ca sert un block ? Tr\u00e8s rapide rappel Imaginons que vous faites un blog. Votre blog peut afficher soit un post, soit une liste &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2009\/09\/19\/des-blocks-dans-des-blocks-dans-des-blocks-dans-des\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Des blocks dans des blocks dans des blocks , dans des &#8230;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_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}},"categories":[6],"tags":[99,98],"class_list":["post-154","post","type-post","status-publish","format-standard","hentry","category-django","tag-django","tag-python"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-2u","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/154","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=154"}],"version-history":[{"count":4,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/154\/revisions"}],"predecessor-version":[{"id":188,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/154\/revisions\/188"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}