如何在 Jinja2 模板中获取当前模板的文件名?

Posted

技术标签:

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

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

【问题讨论】:

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

以上是关于如何在 Jinja2 模板中获取当前模板的文件名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jinja2 中包含具有相对路径的模板

Ansible Jinja2 模板概述 --01

jinja2模板常用方法

Jinja2:如何在包含的模板和可扩展模板中使用命名块

如何调试 Jinja2 模板?

如何在我的 Sendgrid 事务模板中包含 Jinja2 模板