Skip to content

Instantly share code, notes, and snippets.

@shacker
Created February 27, 2014 23:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shacker/9261885 to your computer and use it in GitHub Desktop.
Save shacker/9261885 to your computer and use it in GitHub Desktop.
Template name overlays for Django
from django.template.loader import BaseLoader
from django.template.loader import find_template_loader
from django.template.loader import make_origin
from django.template.base import TemplateDoesNotExist
from django.template.base import Template
'''
Deubug template loader visually shows which templates are being invoked in the
process of rendering an entire page. To use, wrap your your existing loaders
tuple with DebugLoader instead of CachedLoader, e.g.:
TEMPLATE_LOADERS = (
('cir.base.debug_loader.DebugLoader', (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
'dbtemplates.loader.Loader',
)),
)
Bulk of this solution is by Stephan on S.O.:
http://stackoverflow.com/questions/21766176/django-display-template-paths-as-overlay
'''
class DebugLoader(BaseLoader):
is_usable = True
def __init__(self, loaders):
self._loaders = loaders
self._cached_loaders = []
@property
def loaders(self):
# Resolve loaders on demand to avoid circular imports
if not self._cached_loaders:
# Set self._cached_loaders atomically. Otherwise, another thread
# could see an incomplete list. See #17303.
cached_loaders = []
for loader in self._loaders:
cached_loaders.append(find_template_loader(loader))
self._cached_loaders = cached_loaders
return self._cached_loaders
def load_template(self, template_name, template_dirs=None):
source = None
for loader in self.loaders:
try:
source, display_name = loader.load_template_source(template_name, template_dirs)
except TemplateDoesNotExist:
pass
else:
break
if not source:
raise TemplateDoesNotExist
origin = make_origin(display_name, loader.load_template_source, template_name, template_dirs)
try:
template = self.get_template_from_string(source, origin, template_name)
return template, None
except TemplateDoesNotExist:
return source, display_name
def get_template_from_string(self, source, origin, template_name):
open_string = '<div style="font-size:10px; border: 1px solid #bfbfbf;">'
close_string = '</div>'
source = source + open_string + template_name + close_string
return Template(source, origin, template_name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment