Django:将模板路径显示为叠加层

时间:2014-02-13 21:45:54

标签: django templates

我知道django-debug-toolbar有一个模板视图,它将列出在页面请求中调用的所有模板。这很有帮助,但我正在寻找能够进一步展开页面每个块上的标签的东西,指定用于绘制该块的模板(类似于HTML调试工具,如Web Developer的Extension或Firebug)

那里有没有这样做的套餐吗?如果没有,模板是否有办法显示自己的名称?有了这个,我可能会编写一个自定义模板标签,可以在调试模式下执行此操作。


更新:我们使用的最终解决方案是对Stephan解决方案的修改。我在这个要点中将工作版本打包为自定义模板加载器:

https://gist.github.com/shacker/9261885

2 个答案:

答案 0 :(得分:2)

我没有对此进行测试,但您可以编写自己的Template类。

from django.template.base import Template

class DebugTemplate(Template):
  def _render(self, context):
    rendered_template = Template._render(self, context)
    if settings.DEBUG:
      overlay = Template("overlay.html")
      context = Context({"rendered_template": rendered_template})
      return overlay.render(context)
    return rendered_template

您的叠加模板会放置您想要的任何html,并使用{{rendered_template}}变量标记放入实际内容。

然后你必须制作自己的加载器,使用这个Template类而不是内置的Django类。我不相信有一个设置来指定要使用的Template类,但是你可以指定加载器。

在django / template / loader.py中你可以找到BaseLoader,在django / template / loaders /你可以找到加载器本身。您可以创建一个DebugLoader:

from django.template.loader import BaseLoader

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:
      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):
    return DebugTemplate(source, origin, name)

所以,我从CachedLoader中获取了部分内容,并没有放入所有导入。在加载器设置中列出它与CachedLoader相同(不知道它如何与缓存的加载器本身一起工作)。

它应该以每个其他加载器的方式获取模板,然后使用DebugTemplate而不是默认模板。

就像我说的,我没有测试过这个。这就是我能想到的,而不需要付出太多精力。让我知道您可能需要的任何澄清。

答案 1 :(得分:1)

更简单的方法:

#project/shortcuts.py
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.template.base import Template,Context
from django.conf import settings

def render_template(request, template, data=None):
    "Wrapper around render_to_response that fills in template name for you"
    if settings.DEBUG:
        temp = Template("template_debug.html")
        context = Context({"rendered_template": template})
        data['template_debug'] = temp.render(context)
    response = render_to_response(template,
        data,context_instance=RequestContext(request))
    return response

#templates/template_debug.html
<div style="position:absolute; top:0px; left:0px; background-color:#000; color:#fff">
{{ rendered_template }}
</div>

现在你必须做两件事:
1)使用render_template而不是render_to_response - 增加了获取请求上下文的优势。
2)将{{template_debug}}放在您想要查看其呈现位置的任何模板中。