【问题标题】:How to get file name of current template inside Jinja2 template?如何在 Jinja2 模板中获取当前模板的文件名?
【发布时间】:2012-06-24 20:05:26
【问题描述】:

假设我使用return render_template('index.html', users=users)。是否可以在模板中获取文件名而不在视图中显式发送它?

【问题讨论】:

  • 只是想知道:你想做什么? (对答案感兴趣)
  • 我第二个@JeffTratner。你想做什么?
  • 我想根据文件名向正文添加一个类。例如,如果它是“user-details.html”模板,我想添加一个相应的类 以通过javascript正确管理它。
  • 可以在警告中使用,告诉我需要修复的文件。

标签: python html jinja2


【解决方案1】:

虽然没有记录,{{ self._TemplateReference__context.name }} 会给出模板名称。在self._TemplateReference__context 之后,您可以使用许多有趣的属性。

例如,您可以将其添加到最顶层的基本模板中:

        <meta name="template" content="{{ self._TemplateReference__context.name }}">

因此,查看页面源代码将帮助您快速找到相关的模板文件。如果您不想暴露此类信息,请以测试环境为条件。

【讨论】:

  • 如果当前模板是继承的,那么 (Jinja2.10) 这会给你根模板的名称,而不是当前模板。
【解决方案2】:

如果您只需要基本名称,您可以使用{{ self }},它将返回一个包含模板基本名称的repr 字符串,例如&lt;TemplateReference 'view.html'&gt;。您可以使用过滤器对其进行解析,例如 {{ self | quoted }}

@app.template_filter('quoted')
def quoted(s):
    l = re.findall('\'([^\']*)\'', str(s))
    if l:
        return l[0]
    return None

如果您需要完整路径,例如“/full/path/to/view.html”,您可能需要子类化模板。

【讨论】:

  • 它不起作用。当我尝试您的解决方案时,会出现此错误: TemplateAssertionError: no filter named 'quoted'
  • @renatov:你在哪里有@app.template_filter('quoted')?过滤器是否在您的 Flask 应用中正确注册?
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
相关资源
最近更新 更多