{"id":218,"date":"2009-10-30T23:48:16","date_gmt":"2009-10-30T22:48:16","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=218"},"modified":"2009-12-27T15:54:45","modified_gmt":"2009-12-27T14:54:45","slug":"django-tagging-et-le-tag-est-en-toi","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2009\/10\/30\/django-tagging-et-le-tag-est-en-toi\/","title":{"rendered":"Django-tagging, et le tag est en toi"},"content":{"rendered":"<p>Me revoil\u00e0 donc pour le d\u00e9sormais presque c\u00e9l\u00e8bre billet mensuel de la django-app du mois. Comme d&#8217;habitude, je le fais sur le fils, limite \u00e0 \u00eatre en retard. Mais c&#8217;est bien normal, apr\u00e8s tout il me faut bien un mois complet pour choisir, tester \u00e0 fond et r\u00e9diger un magnifique billet concernant l&#8217;app du mois.<\/p>\n<p>L&#8217;app d&#8217;octobre est donc <a href=\"http:\/\/code.google.com\/p\/django-tagging\/\">django-tagging<\/a>. Qui comme son nom l&#8217;indique sert \u00e0 taguer des models.<\/p>\n<h1>O\u00f9 on le trouve, comment on l&#8217;installe, tout \u00e7a quoi ?<\/h1>\n<p>On le trouve, tr\u00e8s simplement sur google-code, sur sa <a href=\"http:\/\/code.google.com\/p\/django-tagging\/\">page projet<\/a>.\u00a0 Pour l&#8217;installation, l\u00e0 aussi c&#8217;est du tr\u00e8s classique :<\/p>\n<ul>\n<li>pip<\/li>\n<li>easy_install<\/li>\n<li>t\u00e9l\u00e9charger un tar.gz<\/li>\n<li>utiliser le svn de google-code<\/li>\n<\/ul>\n<p>moi j&#8217;ai choisi, une fois n&#8217;est pas coutume d&#8217;utiliser easy_install.<\/p>\n<h1>Niveau documentation ?<\/h1>\n<p>Un fichier en ReStructuredText, accessible directement sur le site et pr\u00e9sent dans les sources donne la doc et des exemples d&#8217;utilisation. Il n&#8217;est d&#8217;ailleurs par forc\u00e9ment \u00e0 jour. Certaines fonctionnalit\u00e9s d\u00e9crites comme \u00e9tant dans la version de dev sont en fait dans la 0.3<\/p>\n<p>En plus, trois petites pages sont pr\u00e9sentes sur le wiki :<\/p>\n<ul>\n<li>une pour parler d&#8217;un tips d&#8217;utilisation (avec des properties)<\/li>\n<li>une pour les incompatibilit\u00e9 entre versions<\/li>\n<li>une pour les id\u00e9es et le planning<\/li>\n<\/ul>\n<h1>Ils sont o\u00f9 les murs alors ? ( ou qu&#8217;est ce qu&#8217;on peut faire avec django-tagging)<\/h1>\n<p>Ok, ce titre de chapitre est surement le plus pourris de ma carri\u00e8re de cr\u00e9ateur de titre de chapitre, mais tant pis j&#8217;assume.<\/p>\n<h2>Le configurer<\/h2>\n<p>Il y a quelques possibilit\u00e9 de configuration, en setant des variables dans le settings.py du projet. On peut par exemple forcer \u00e0 ce que les tags soient en minuscule ou donner la longueur maxi d&#8217;un tag.<\/p>\n<h2>L&#8217;utiliser<\/h2>\n<p>On peut donc taguer des instances de model. Mais bon en disant cela, j&#8217;ai rien dit. En fait on peut register des models pour pouvoir ensuite simplement rajouter des tags (ou les lister) aux instances de ces models.<\/p>\n<p>On peut \u00e9galement passer directement par les managers de Tags, fournit par l&#8217;app, pour taguer des instances.<\/p>\n<h2>L&#8217;utiliser encore plus<\/h2>\n<p>il y a quelques fonctions utilitaires fournis avec l&#8217;app.<\/p>\n<p>On pourra par exemple ( avec la fonction get_intersection_by_model) r\u00e9cup\u00e9r\u00e9 le sous-ensemble des instances contenu dans le queryset pass\u00e9 en param\u00eatre 1 qui sont tagu\u00e9s avec tout les tags d&#8217;une liste pass\u00e9 en param\u00eatre 2<\/p>\n<p>De m\u00eame avoir toutes les instances d&#8217;un models tagu\u00e9s par un ou plusieurs tags est possible avec la fonction get_by_model, mais aussi les unions d&#8217;instance ou les groupe d&#8217;instance ayant les m\u00eame tag qu&#8217;un autre objet \u2026<\/p>\n<p>Et aussi (et presque surtout aurais-je envie de dire) la fonction calculate_cloud qui permet de calculer le nuage de tag en calculant une taille de font pour chacun des tags pass\u00e9 en param\u00e8tre. (l&#8217;algorithme utilis\u00e9 pour le calcul est configurable, en plus)<\/p>\n<h2>afficher les tags<\/h2>\n<p>Avec 4 templatestags diff\u00e9rent pour afficher le nuage de tag, tout les tags d&#8217;un objet, tout les objets (d&#8217;un model pr\u00e9cis) tagu\u00e9s avec un tag pr\u00e9cis, ou tout les tags qui sont reli\u00e9s \u00e0 un model (enfin \u00e0 ses instances, vous m&#8217;avez compris)<\/p>\n<h1>Conclusion.<\/h1>\n<p>M\u00eame si la fa\u00e7on d&#8217;ajouter un tag peu sembler un peu alambiqu\u00e9 (pour pouvoir avoir des tags avec des espaces, ou avec des espaces plus des guillemets, etc .. ) , c&#8217;est vraiment une bonne app, qui ne fait qu&#8217;une chose, mais qui le fait tr\u00e8s bien. Donc, je ne peux que conseiller son utilisation.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Me revoil\u00e0 donc pour le d\u00e9sormais presque c\u00e9l\u00e8bre billet mensuel de la django-app du mois. Comme d&#8217;habitude, je le fais sur le fils, limite \u00e0 \u00eatre en retard. Mais c&#8217;est bien normal, apr\u00e8s tout il me faut bien un mois complet pour choisir, tester \u00e0 fond et r\u00e9diger un magnifique billet concernant l&#8217;app du mois. &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2009\/10\/30\/django-tagging-et-le-tag-est-en-toi\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Django-tagging, et le tag est en toi<\/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-218","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-3w","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/218","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=218"}],"version-history":[{"count":4,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/218\/revisions"}],"predecessor-version":[{"id":221,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/218\/revisions\/221"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}