Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:将模板路径显示为覆盖_Django_Templates - Fatal编程技术网

Django:将模板路径显示为覆盖

Django:将模板路径显示为覆盖,django,templates,Django,Templates,我知道django调试工具栏有一个Templates视图,它将列出页面请求中调用的所有模板。这很有帮助,但我正在寻找一种更进一步的方法,在页面的每个块上直观地显示一个标签,指定用于绘制该块的模板(类似于HTML调试工具,如WebDeveloper的Extension或Firebug) 有没有一个包已经这样做了?如果没有,模板是否可以显示自己的名称?这样,我就可以编写一个自定义模板标记,在调试模式下完成这项工作 更新:我们使用的最终解决方案是对下面Stephan解决方案的修改。在本文中,我将工作

我知道django调试工具栏有一个Templates视图,它将列出页面请求中调用的所有模板。这很有帮助,但我正在寻找一种更进一步的方法,在页面的每个块上直观地显示一个标签,指定用于绘制该块的模板(类似于HTML调试工具,如WebDeveloper的Extension或Firebug)

有没有一个包已经这样做了?如果没有,模板是否可以显示自己的名称?这样,我就可以编写一个自定义模板标记,在调试模式下完成这项工作


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


我还没有测试过这个,但是您可以编写自己的模板类

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}}变量标记放入实际内容

然后,您必须创建自己的加载程序,以使用此模板类而不是内置的Django类。我认为没有设置来指定要使用的模板类,但可以指定加载程序

在django/template/loader.py中可以找到BaseLoader,在django/template/loaders/中可以找到加载程序本身。您可以创建调试加载程序:

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中获取了部分内容,并没有输入所有的导入内容。在加载程序设置中列出它,与缓存加载程序相同(不确定它如何与缓存加载程序一起工作)

它应该像其他加载程序一样获取模板,然后使用DebugTemplate而不是默认模板


就像我说的,我没有测试这个。这正是我能想到的,不用花太多精力。请告诉我您可能需要的任何澄清。

更简单的方法:

#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>
#项目/shortcuts.py
从django.template导入请求上下文
从django.shortcuts导入渲染到响应
从django.template.base导入模板,上下文
从django.conf导入设置
def render_模板(请求、模板、数据=无):
“用于填充模板名称的render_to_响应的包装器”
如果设置为.DEBUG:
temp=Template(“Template_debug.html”)
上下文=上下文({“呈现的模板”:模板})
数据['template_debug']=临时呈现(上下文)
响应=渲染到响应(模板,
数据,上下文\实例=请求上下文(请求))
返回响应
#模板/template_debug.html
{{rendered_template}}
现在你必须做两件事:
1) 使用render_模板而不是render_to_响应-增加了获取请求上下文的优势。

2) 将{template_debug}}放在任何要查看其呈现位置的模板中。

在我们的例子中,不使用render_to_响应将不是一个选项(我们的代码库使用了多个抽象层,这将使这成为不可能。但我总体上喜欢这种方法,并将使用其中的一部分。完成后,我将编辑问题以显示最终解决方案。谢谢!这比我希望的要复杂,但这是一个出色的回答。非常感谢。我将编辑问题以显示最终解决方案当我把它全部连接起来的时候。谢谢!好吧!我已经开始工作了。我简化了一点,不再需要一个单独的模型和模板-只需要加载程序,m'aam。非常感谢!我已经把它打包成一个公开的要点:谢谢你的要点!