Created
February 27, 2014 23:25
-
-
Save shacker/9261885 to your computer and use it in GitHub Desktop.
Template name overlays for Django
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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