2009-05-13 6 views
4

À des fins de débogage, j'aimerais disposer d'une variable dans tous mes modèles contenant le chemin du modèle rendu. Par exemple, si une vue rend templates/account/logout.html, je voudrais que {{template_name}} contienne la chaîne templates/account/logout.html. Je ne veux pas changer de vues (surtout parce que je réutilise beaucoup d'applications), donc le chemin à suivre semble être un processeur de contexte qui introspecte quelque chose. La question est de savoir introspecter.Obtention du nom de modèle dans le modèle django

Ou peut-être cela est-il intégré et je ne sais pas à ce sujet?

Répondre

8

La manière simple:

Téléchargez et utilisez le django debug toolbar. Vous obtiendrez une approximation de ce que vous recherchez et un tas de plus.

La façon moins facile:

Remplacer Template.render avec django.test.utils.instrumented_test_render, écouter le signal django.test.signals.template_rendered et ajouter le nom du modèle au contexte. Notez que TEMPLATE_DEBUG doit être true dans votre fichier de paramètres ou qu'il n'y aura pas d'origine à partir de laquelle obtenir le nom.

if settings.DEBUG and settings.TEMPLATE_DEBUG 

    from django.test.utils import instrumented_test_render 
    from django.test.signals import template_rendered 


    def add_template_name_to_context(self, sender, **kwargs) 
     template = kwargs['template'] 
     if template.origin and template.origin.name 
      kwargs['context']['template_name'] = template.origin.name 

    Template.render = instrumented_test_render 

    template_rendered.connect(add_template_name_to_context) 
+0

Où dois-je copier-coller ce code? Quel fichier? – Kostyantyn

1

Les modèles ne sont que des chaînes et non des noms de fichiers. Probablement votre meilleure option est de patch de singe render_to_response et/ou direct_to_template et de copier le nom de fichier arg dans le contexte.

Questions connexes