{"id":883,"date":"2010-09-27T14:17:59","date_gmt":"2010-09-27T12:17:59","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=883"},"modified":"2010-09-27T15:59:50","modified_gmt":"2010-09-27T13:59:50","slug":"django-taggit-le-tag-est-mort-vive-le-tag","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2010\/09\/27\/django-taggit-le-tag-est-mort-vive-le-tag\/","title":{"rendered":"Django-taggit, le tag est mort, vive le tag .."},"content":{"rendered":"<p>J&#8217;ai d\u00e9j\u00e0 fait, il y en fait 11 mois, un <a href=\"http:\/\/j-mad.com\/blog\/2009\/10\/30\/django-tagging-et-le-tag-est-en-toi\/\">billet de la django app du mois sur une app de tag, django-tagging<\/a>. Lorsque je l&#8217;ai test\u00e9, django-tagging \u00e9tait \u00e0 la version 0.3. Aujourd&#8217;hui, elle est version 0.3.1. Et les derniers commit remonte \u00e0 janvier 2010 ( ce sont ceux ayant aboutis \u00e0 la version 0.3.1)<\/p>\n<p>Je me suis donc dit, qu&#8217;il \u00e9tait peut-\u00eatre tant de revenir sur le sujet et de pr\u00e9senter une autre app django, sur le m\u00eame sujet, qui m\u00eame si pour l&#8217;instant pr\u00e9sente quelques lacunes compar\u00e9e \u00e0 <a href=\"http:\/\/alexgaynor.net\/2010\/sep\/21\/django-taggit-09-released\/\">django-tagging<\/a>, me semble prometteuse.<\/p>\n<p>Et cette app, c&#8217;est, roulement de tambour&#8230;., django-taggit d&#8217;<a href=\"http:\/\/twitter.com\/alex_gaynor\">Alex Gaynor<\/a> (un trublion bien connu pour ceux qui font du django)<\/p>\n<h1>1- O\u00f9 on le trouve, comment on l\u2019installe, tout \u00e7a quoi (et la doc)\u00a0?<\/h1>\n<p>Alors on le trouve tout simplement sur sa page <a href=\"http:\/\/pypi.python.org\/pypi\/django-taggit\">Pypi<\/a> ou sur sa page <a href=\"http:\/\/github.com\/alex\/django-taggit\">github d&#8217;ailleurs<\/a><\/p>\n<p>Pour l&#8217;installation rien de plus simple\u00a0:<\/p>\n<ul>\n<li>un easy_install ou un pip<\/li>\n<li>un git clone<\/li>\n<\/ul>\n<p>Pour la doc, l\u00e0 il n&#8217;y a vraiment rien \u00e0 redire, le projet offre une doc tr\u00e8s bien fournie sur <a href=\"http:\/\/django-taggit.readthedocs.org\/index.html\">readthedocs.org<\/a>.<\/p>\n<h1>2- Mais au fait, \u00e0 quoi \u00e7a sert\u00a0?<\/h1>\n<p>Tout simplement \u00e0 taguer des objets. Exactement comme django-tagging donc. Vous allez pouvoir taguer vos objets, filtrer les objets en fonction des tags qu&#8217;ils ont ou trouver des objets similaires de par leur tag.<\/p>\n<p>Vous allez aussi pouvoir modifier l\u00e9g\u00e8rement la m\u00e9canique interne. Par exemple si utiliser des generics key ne vous plait pas, tout est pr\u00e9vu pour que vous puissiez simplement les remplacer par des foreign key. Vous pourrez aussi changer d&#8217;autre m\u00e9canismes comme le model utilis\u00e9 pour sauver les Tags.<\/p>\n<h1>3- Comment \u00e7a marche\u00a0?<\/h1>\n<p>Tout d&#8217;abord il faudra que vous ajoutiez, pour chaque models que vous voulez rendre &#8216;tagable&#8217; un manager de tag. (Pour ceux qui se souviennent django-tagging permet de taguer directement des instances de models, sans modifier la classe Model en question).<\/p>\n<p>Ca peut para\u00eetre un peu lourd et \u00e7a rend l&#8217;app assz intrusive, mais bon, c&#8217;est comme \u00e7a. Et puis du coup \u00e7a permet, il faut bien l&#8217;avouer d&#8217;avoir une \u00e9criture plus fluide et plus ramass\u00e9 de son code. Nul besoin de toujours passer par la classe Tag en filtrant sur l&#8217;objet dont l&#8217;on veut r\u00e9cup\u00e9rer les tags. Un simple object.tags suffit pour avoir tout ses tags.<\/p>\n<p>Facilit\u00e9 d&#8217;utilisation ou intrusivit\u00e9, \u00e0 vous de choisir, django-taggit, lui\u00a0 \u00e0 choisit. (Et bon, au pire, un bon petit <a href=\"http:\/\/friendpaste.com\/6V9OFmiCKojeag1qbVRYnd\">contribute_to_model<\/a> devrait permettre une extensibilit\u00e9 moins intrusive).<\/p>\n<p>Pour ajouter les tags, les syntaxes possible sont \u00e0 peu pr\u00e8s les m\u00eames que celle de django-tagging, \u00e0 savoir (l&#8217;image est une <a href=\"http:\/\/django-taggit.readthedocs.org\/forms.html\">capture d&#8217;\u00e9cran d&#8217;une partie de la doc<\/a>)\u00a0:<br \/>\n<a href=\"http:\/\/j-mad.com\/blog\/wp-content\/uploads\/2010\/09\/syntax_django_taggit.png\" rel=\"lightbox[883]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-884\" title=\"syntax_django_taggit\" src=\"http:\/\/j-mad.com\/blog\/wp-content\/uploads\/2010\/09\/syntax_django_taggit-300x59.png\" alt=\"\" width=\"300\" height=\"59\" srcset=\"https:\/\/j-mad.com\/blog\/wp-content\/uploads\/2010\/09\/syntax_django_taggit-300x59.png 300w, https:\/\/j-mad.com\/blog\/wp-content\/uploads\/2010\/09\/syntax_django_taggit-150x29.png 150w, https:\/\/j-mad.com\/blog\/wp-content\/uploads\/2010\/09\/syntax_django_taggit.png 945w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Un truc \u00e0 ne pas oublier, django-taggit utilise des many to many. Donc, n&#8217;oubliez pas le save_m2m si vous utilisez des forms.<\/p>\n<p>Ensuite, vous pourrez bien entendu supprimer des tags, les lister, filtrer des objets en fonction de leur tags ou avoir une liste des objets similaires. C&#8217;est une vrai liste qui est class\u00e9e par ordre de similarit\u00e9s.<\/p>\n<h1>4- Une app peut en cacher deux autres.<\/h1>\n<p>L\u00e0, \u00e0 cette instant de votre lecture vous vous dites peut-\u00eatre &#8216;Mais mer..mince alors, il manque des trucs compar\u00e9s \u00e0 django-tagging, il n&#8217;y a m\u00eame pas de templates tags d&#8217;affichage&#8217;.<\/p>\n<p>Et vous auriez raison. Sauf que, sauf que&#8230; Il y a des applications qui \u00e9tendent django-taggit \u00e0 savoir\u00a0:<\/p>\n<ul>\n<li><a href=\"http:\/\/github.com\/frankwiles\/django-taggit-suggest\">django-taggit-suggest<\/a> qui permet d&#8217;ajouter des fonctionnalit\u00e9s de suggestion de tags<\/li>\n<li><a href=\"http:\/\/github.com\/feuervogel\/django-taggit-templatetags\">django-taggit-templatetags<\/a> qui offre diff\u00e9rents templatetags d&#8217;affichage des tags, dont un par cloud.<\/li>\n<\/ul>\n<h1>5- Au final<\/h1>\n<p>Vu le statut de quasi moribond de django-tagging compar\u00e9 \u00e0 la vigueur actuelle de django-taggit, je pense vraiment que si vous avez besoin d&#8217;une application qui g\u00e9re les tags, django-taggit est un meilleur choix. Et puis, je trouve \u00e7a rassurant qu&#8217;il y ait des applications externes pour \u00e9tendre django-taggit.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J&#8217;ai d\u00e9j\u00e0 fait, il y en fait 11 mois, un billet de la django app du mois sur une app de tag, django-tagging. Lorsque je l&#8217;ai test\u00e9, django-tagging \u00e9tait \u00e0 la version 0.3. Aujourd&#8217;hui, elle est version 0.3.1. Et les derniers commit remonte \u00e0 janvier 2010 ( ce sont ceux ayant aboutis \u00e0 la version &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2010\/09\/27\/django-taggit-le-tag-est-mort-vive-le-tag\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Django-taggit, le tag est mort, vive le tag ..<\/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":[35],"tags":[99,98],"class_list":["post-883","post","type-post","status-publish","format-standard","hentry","category-la-django-app-du-mois","tag-django","tag-python"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-ef","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/883","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=883"}],"version-history":[{"count":5,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/883\/revisions"}],"predecessor-version":[{"id":889,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/883\/revisions\/889"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}