Jan 312010
 

Oui, je sais, je devrais renouveler un peu mon stock de blagues. Parce que mettre des cong à la fin de tout et n’importe quoi, pour singer l’accent marseillais, ça commence à …. Je sais. (j’en profite pour vous rappeler que le 24 et 25 avril, il va y avoir la DjangoCong à Marseille, une super convention fr où ça va parler django, encore et encore).

Et, oui, la django-app du mois de janvier arrive vraiment sur le fil, à quelques heures du dépassement de délai. Mais faudra dire ça au crétin qui a décidé qu’une journée ça ne serait que 24h et qu’il fallait obligatoirement dormir chaque nuit, ou presque … (bordeille comment je vais faire en février moi..)

Enfin, je reste dans les délais, c’est le principal. Et pour le deuxième mois consécutif, je fais une petit entorse au principe de cette catégorie, vue que ce mois-ci, encore une fois, ce n’est pas une vrai django-app que je présente, mais un ‘simple’ module python.

0- Et ça sert à quoi  ?

En fait tagcon est ‘inutile’ (donc indispensable vous allez me dire… ne niez pas, je vous ai tous entendu le dire…). Il sert simplement à faciliter l’écriture des templatetags (et surtout des templates tags à argument). On pourrait se dire que c’est assez inutile. Mais en fait, ça permet de gagner un peu de temps et de réduire d’une façon assez intéressante la taille de son code. Donc..

Un petit exemple, tiré de la doc, parce que comme me l’a fait remarquer daks (dont je conseille le blog, qui vient d’arriver dans mes RSS) , ça manque :

from django.contrib.auth.models import User
from django.template import Library
import tagcon

register = Library()

class UserListTag(tagcon.TemplateTag):
    limit = tagcon.IntegerArg(default=10)

    def render(self, context):
        self.resolve(context)
        yield "<ul>"
        for user in User.objects.all()[:self.args.limit]:
            yield "<li>%s</li>" % (user.username,)
        yield "</ul>"

1- Où on le trouve, comment on l’installe, tout ça quoi ?

Alors alors, sur le github qui va bien. (une petite remarque qui a rien à voir, je préfère de loin bitbucket à github … et pas juste parce que mercurial c’est mieux que git).

Une fois qu’on a récupérer le package (par fork si on a un compte github ou avec un petit tar.gz), il y a deux façon de l’installer:

  • un petit python setup.py install
  • en copiant directement le fichier base.py qui se trouve dans tagcon.tagcon (dans ce cas là on pourra renommer base.py en tagcon.py).

2- La documentation.

Alors là… Il n’y a pas grand chose. Un fichier readme qui donne un petit exemple et c’est tout. Après, il vous faudra lire les tests et le fichier source directement. Ce n’est pas donc super fourni, mais d’un autre coté, vous me direz que le module est tellement simple que ça suffit. Et vous ne seriez pas loin d’avoir raison. Mais bon.

3- En conclusion

Au départ, quand j’ai découvert ce petit module (je crois que je dois, encore une fois, remercier benoitc pour cela), je n’étais vraiment pas convaincu de son utilité. Il me semblait presque inutile et puis un peu restrictif en obligeant à utiliser la fonction render (alors que j’ai plus l’habitude d’enregistrer les fichier template html avec le décorateur inclustion_tag). Mais au final, on se ren compte que ça simplifie pas mal les choses et on y prend rapidement goût.

4- dernier paragraphe complètement HS.

Ma liste de django-app à tester est loin d’être vide (avec entre autre piston, haystack,..) et ça ne risque pas de changer, vu que chaque semaine, je découvre une nouvelle app. Toutefois, j’écris ces billets avant tout pour qu’ils soient utile . Donc, si vous connaissez des app que vous adorez et que vous aimerez faire découvrir à tous. Laissez moi leur nom en commentaire et je m’efforcerais de les tester.


Flattr this!

 Posted by at 18:23

  6 Responses to “Tagcon, où comment écrire simplement les templatetags, cong !!”

  1. et pourquoi mercurial c’est mieux que git ??? hein ?
    tantan : http://whyhgisbetterthanx.com/ !!!

    (et vlà un commentaire inutile de plus…)

  2. Je n’ai pas de django-app à proposer, mais j’en verrais bien une qui gère les applications Django elles-mêmes. En particulier, elle pourrait offrir de l’assistance à la révision de modèles (par exemple pouvoir changer le nom d’un champ ou d’un modèle sans avoir à manuellement migrer les enregistrements de la base). On peut même imaginer que la base contienne des tables et instances correspondant à des versions différentes d’un même modèle, avec mise à niveau des instances uniquement dans des états spécifiés. Ce sont des problèmes très classiques des applis évolutives. Je ne suis pas très renseigné et peut-être que Django offre déjà une solution.

    Je suis assez fan de Django, mais je dois dire que ce problème de gestion de l’évolution des applis est un inconvénient majeur, dû au manque de flexibilité des bases SQL. De ce point de vue là, les systèmes à base d’objets moins structurés, comme les bases XML (eg. eXist) offrent une alternative interessante.

    A part ça, j’ai vu dans un précédent message de ce blog que tu mentionnais un système qui permet d’encapsuler des sources externes. Je suppose que ça ne marche qu’en lecture?

    • pour les applis qui permettent de faire évoluer les modéles. Il y a django-evolution et south. Mais elles ne permettent pas de garder plusieurs “versions différentes” des schéma de BD (enfin je crois bien).

      Pour les encapsulation de sources, tu dois parler de django-ROA et non ça marche aussi en écriture, si ta source externe t’en donne le droit, bien entendu

  3. Merci pour les infos. Django-evolution semble très générique, on peut écrire n’importe quel code de migration, y compris du code qui gère des versions multiples au sein de la même base, mais je n’ai pas vu de support particulier pour cela. En tous cas, je le verrais bien comme une prochaine “appli du mois”…

    • elle est dans ma todo list d’app du mois.

      Ca sera pas pour ce mols-ci vu qu’il me reste 2 jours pour écrire mon billet (et que j’ai déjà choisi mon app) mais un mois où j’ai un peu de temps, je m’attaquerais à evolution ouaip.

Sorry, the comment form is closed at this time.