2010-01-25 2 views
3

Est-il possible de faire en sorte que le chargeur de gabarits de Django exécute tous les gabarits qu'il charge (c'est-à-dire directement ou via extend/include) via SHPAML s'il indique que le HTML est obsolète? Je sais comment appeler SHPAML récursivement sur un répertoire entier, mais je préférerais pouvoir l'exécuter à la demande, donc je n'ai pas besoin de me souvenir de synchroniser le HTML chaque fois que je change la source SHPAML. J'imagine que l'appel de SHPAML à partir de manage.py fonctionnerait aussi (au moins pour les serveurs de test), mais être capable de pirater le moteur de gabarit de Django et le faire tourner tous les fichiers qu'il charge via un préprocesseur serait plus agréable.Pré-traiter SHPAML dans le chargeur de modèles de Django?

+0

J'ai trouvé pour ajouter commandes à 'manage.py': http://docs.djangoproject.com/fr/1.1/howto/custom-management-commands/ --- malheureusement, cela n'aide pas avec la partie" sur demande ", cependant. –

Répondre

3

Je pense que vous pouvez obtenir ce que vous voulez en héritant de django.template.loaders.app_directories.Loader (ou tout autre chargeur que vous utilisez) et écrasez la méthode load_template_source, par exemple:

from django.template.loaders.app_directories import Loader 
from shpaml import convert_text 

class SHPAMLLoader(Loader): 
    def load_template_source(self, *args, **kwargs): 
     shpaml_source = super(SHPAMLLoader, self).load_template_source(*args, **kwargs) 
     html = convert_text(shpaml_source) 
     return html 

Ensuite, mettez votre chargeur au début de la TEMPLATE_LOADERS tuple votre settings.py. Bien sûr, vous allez faire la danse SHPAML en HTML chaque fois qu'un gabarit est chargé, donc vous pouvez voir des frais généraux. La prochaine mise en cache de modèles Django 1.2, qui pourrait aider à atténuer cette surcharge ...

Avertissement: ce code est complètement non testé, désolé.

+0

Ce n'est pas tout à fait ce que j'espérais, mais c'est assez proche. En particulier, cela ne facilite pas le problème de mise en cache (les modèles ne doivent être prétraités que lorsque le fichier source a été modifié, sinon le fichier prétraité doit être chargé, pas la source SHPAML). C'est probablement un pas dans la bonne direction, cependant. –

1

Juste créé un projet basé sur l'extrait dans la réponse de piquadrat. Il est un peu plus complète des fonctionnalités et prend en charge django 1.1 et 1.2 (probablement 1.0 aussi bien)

pensé qu'il pourrait être utile pour l'avenir :)

Questions connexes