{"id":546,"date":"2010-04-03T11:03:49","date_gmt":"2010-04-03T09:03:49","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=546"},"modified":"2010-04-03T11:03:49","modified_gmt":"2010-04-03T09:03:49","slug":"petit-memo-concernant-la-syndication-django","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2010\/04\/03\/petit-memo-concernant-la-syndication-django\/","title":{"rendered":"Petit m\u00e9mo concernant la syndication Django"},"content":{"rendered":"<p>Ce billet n&#8217;est qu&#8217;un petit m\u00e9mo rapide, pour \u00e9viter que d&#8217;autre perdent comme moi du temps \u00e0 chercher un probl\u00e8me qui n&#8217;en est pas un. Si jamais je me trompe dans mon interpr\u00e9tation du probl\u00e8me et dans la solution que j&#8217;en donne, je suis preneur d&#8217;une explication \/ correctif dans les commentaires.<\/p>\n<p>Django embarque, dans les contrib, un petit framework pour g\u00e9r\u00e9 la syndication. Plut\u00f4t bien foutu d&#8217;ailleurs.<\/p>\n<p>Il fonctionne suivant un principe assez simple, pour chaque flux on d\u00e9finit une classe, ensuite on range les classes dans un dict o\u00f9 la cl\u00e9 sera le nom du flux dans l&#8217;url et la valeur, la classe, que l&#8217;on passe en param\u00e8tre \u00e0 la vue qui g\u00e8re l&#8217;ensemble des flux. (tout est parfaitement expliqu\u00e9 <a title=\"doc django syndication framework\" href=\"http:\/\/docs.djangoproject.com\/en\/1.1\/ref\/contrib\/syndication\/#ref-contrib-syndication\">dans la doc, ici<\/a>).<\/p>\n<p>Par exemple :<\/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\">conf<\/span>.<span class=\"me1\">urls<\/span>.<span class=\"me1\">defaults<\/span> <span class=\"kw1\">import<\/span> *<br \/>\n<span class=\"kw1\">from<\/span> myproject.<span class=\"me1\">feeds<\/span> <span class=\"kw1\">import<\/span> LatestEntries<span class=\"sy0\">,<\/span> LatestEntriesByCategory<br \/>\n<br \/>\nfeeds <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"st0\">'latest'<\/span>: LatestEntries<span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">'categories'<\/span>: LatestEntriesByCategory<span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\nurlpatterns <span class=\"sy0\">=<\/span> patterns<span class=\"br0\">&#40;<\/span><span class=\"st0\">''<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"co1\"># ...<\/span><br \/>\n<span class=\"br0\">&#40;<\/span>r<span class=\"st0\">'^feeds\/(?P&lt;url&gt;.*)\/$'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'django.contrib.syndication.views.feed'<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><span class=\"st0\">'feed_dict'<\/span>: feeds<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"co1\"># ...<\/span><br \/>\n<span class=\"br0\">&#41;<\/span><\/div><\/div>\n<p>ici on aura donc deux urls :<\/p>\n<ul>\n<li>\/feeds\/latest<\/li>\n<li>\/feeds\/categories<\/li>\n<\/ul>\n<p>On peut d\u00e9finir deux templates celui pour justes les titres et celui pour l&#8217;item RSS complet. Les deux templates doivent avoir pour nom :<\/p>\n<ul>\n<li>KeyDict_title.html<\/li>\n<li>KeyDict_description.html<\/li>\n<\/ul>\n<p>Soit dans notre exemple :<\/p>\n<ul>\n<li>latest_title.html<\/li>\n<li>latest_description.html<\/li>\n<li>categories_title.html<\/li>\n<li>categories_description.html<\/li>\n<\/ul>\n<p>Et tout fonctionne parfaitement dans le meilleur des mondes.<\/p>\n<p>Maintenant prenant un exemple un peu plus compliqu\u00e9. Imaginons deux apps django, une pour g\u00e9rer un blog, une pour g\u00e9rer des reviews de films.<br \/>\nLes deux apps vont donc mettre en place des flux RSS, logique.<br \/>\nEt les deux vont vouloir mettre en place le flux latest. Donc dans chaque r\u00e9pertoire templates des apps, il y aura un sous-r\u00e9pertoire feeds avec les fichiers latest_title.html et latest_description.html<\/p>\n<p>Et l\u00e0, patatra. Le deuxi\u00e8me flux (dans l&#8217;ordre des INSTALLED_APPS) va utiliser les fichiers templates du premier. Parce qu&#8217;apparement la recherche des templates pour les feeds et transversale.<br \/>\nDonc faut nommer de mani\u00e8re diff\u00e9rentes ses flux. latestblogs et latestreviews par exemple.<\/p>\n<p>Et l\u00e0, miracle, \u00e7a fonctionne.<\/p>\n<p>Voil\u00e0, c&#8217;est tout.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce billet n&#8217;est qu&#8217;un petit m\u00e9mo rapide, pour \u00e9viter que d&#8217;autre perdent comme moi du temps \u00e0 chercher un probl\u00e8me qui n&#8217;en est pas un. Si jamais je me trompe dans mon interpr\u00e9tation du probl\u00e8me et dans la solution que j&#8217;en donne, je suis preneur d&#8217;une explication \/ correctif dans les commentaires. Django embarque, dans &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2010\/04\/03\/petit-memo-concernant-la-syndication-django\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Petit m\u00e9mo concernant la syndication Django<\/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-546","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-8O","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/546","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=546"}],"version-history":[{"count":2,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/546\/revisions"}],"predecessor-version":[{"id":548,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/546\/revisions\/548"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}