2013-04-02 2 views
6

Gibt es eine Möglichkeit, in generierte Ansicht ausführliche Informationen über die Vorlagengenerierung im Debug-Modus zu schreiben? Zum Beispiel könnte es eine solche Ausgabe erzeugen:Ausführlicher Modus in Django Vorlagen-Tags

base.html:

<html> 
<body> 
{% block content %} 
{% endblock %} 
</body> 
</html> 

seite.html:

{% extend "base.html" %} 
{% block content %} 
Foo 
{% include "inner.html" %} 
Bar 
{% endblock %} 

In eine solche Form:

<html> 
<body> 
<!-- block content --> 
<!-- from "page.html" --> 
Foo 
<!-- include "inner.html" --> 
Bar 
<!-- endblock content --> 
</body> 
</html> 

Warum? Weil manchmal einige größere Abhängigkeiten nur durch IDE sehr schwierig sind. Oder kennen Sie vielleicht ein gutes Werkzeug zur einfacheren Navigation (Grafiken erstellen etc.)? Natürlich sollten diese Informationen nur im Debug-Modus generiert werden. In der Produktion sollten sie verschwinden.

+2

Gute Frage! Sie können sehen, ob ['django-debug-toolbar'] (https://github.com/django-debug-toolbar/django-debug-toolbar) oder [' django-template-repl'] (https: // github .com/codysoyland/django-template-repl) ist hilfreich. –

+0

Für mich ist 'django-template-repl' total nutzlos, weil ich einen ganzen Baum von Dateien hineingeben muss und wenn ich die Antwort wissen würde, welche Datei schlecht ist, würde ich meine Antwort ohne sie haben. Ich habe diese Frage wegen der magischen Templatetags in Code erstellt, die ich jetzt pflege, die Magie abhängig vom eingefügten Modell verwenden (Vorlagen als Liste: '(" {app_label}/{modell}/{template} .html "," {template} .html ")') und die Ausgabe ist zu unterschiedlich zu einer Vorlage, die ihren Inhalt verwendet. 'django-debug-toolbar' ist nah dran, aber nicht genug, jetzt benutze ich es. – zwierzak

+0

Magie ist böse. hast du an ein kleines sed-script gedacht, um den html-kommentar nach jedem block/include und vor jedem endblock hinzuzufügen? – ornoone

Antwort

2

Sie können dies möglicherweise mit Middleware erreichen. Vor einiger Zeit hatte ich ein ähnliches Problem, indem ich die Vorlagen und die sie aufrufenden Ansichten im Auge behielt, also schrieb ich ein Middleware-Snippet, das oben auf der HTML-Antwort einen Kommentarblock hinzufügte. Es tut nicht ganz das, was Sie fragen, aber Sie könnten es vielleicht anpassen.

COMMENT_BLOCK = """ 
<!-- 
[ url  ] >> http://%(host)s%(path)s 
[ referer ] >> %(referer)s 
[ module ] >> %(module)s 
[ function ] >> %(function)s, line %(line)s 
[ args  ] >> args=%(args)s, kwargs=%(kwargs)s, defaults=%(defaults)s 
[ template ] >> %(template)s 
--> 

""" 

# Add any additional template types you wish to add the comment block to. 
MIMETYPES = (
    "text/html", 
    "text/xml", 
) 


class HtmlTemplateFinder: 

    def __init__(self): 
     self.host = None 
     self.referer = None 
     self.path = None 
     self.module = None 
     self.function = None 
     self.line = None 
     self.args = None 
     self.kwargs = None 
     self.defaults = None 
     self.template = None 
     self.valid_template = False 

    def _populate_comment_block(self): 
     return COMMENT_BLOCK % { 
           'host': self.host, 
           'referer': self.referer, 
           'path': self.path, 
           'module': self.module, 
           'function': self.function, 
           'line': self.line, 
           'args': self.args, 
           'kwargs': self.kwargs, 
           'defaults': self.defaults, 
           'template': self.template, 
           } 

    def process_view(self, request, view_func, view_args, view_kwargs): 
     self.host = request.META.get('HTTP_HOST', None) 
     self.referer = request.META.get('HTTP_REFERER', None) 
     self.path = request.path 
     self.module = view_func.func_code.co_filename 
     self.function = ('.').join((view_func.__module__, view_func.func_name)) 
     self.line = view_func.func_code.co_firstlineno 
     self.args = view_args 
     self.kwargs = view_kwargs 
     self.defaults = view_func.func_defaults 
     return None 

    def process_template_response(self, request, response): 
     from mimetypes import guess_type 
     # Use this rather than response.template_name, this always returns str 
     self.template = response.resolve_template(response.template_name).name 
     self.valid_template = guess_type(self.template)[0] in MIMETYPES 
     return response 

    def process_response(self, request, response): 
     from <your app> import settings 
     if settings.DEBUG: 
      if self.valid_template: 
       block = self._populate_comment_block() 
       response.content = "%s%s" % (block, response.content) 
     return response