如何在 Jinja2 模板中包含 HTML 文件?

Posted

技术标签:

【中文标题】如何在 Jinja2 模板中包含 HTML 文件?【英文标题】:How do I include a HTML file in a Jinja2 template? 【发布时间】:2014-05-16 14:34:01 【问题描述】:

我正在为使用 Jinja 模板的服务器使用 Flask 微框架。

我有一个父 template.html 和一些名为 child1.htmlchild2.html 的子模板,其中一些子模板是相当大的 HTML 文件,我想以某种方式拆分它们以便在我的工作中更清晰。

我的main.py 脚本的内容:

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/')
@app.route('/<task>')
def home(task=''):
  return render_template('child1.html', task=task)

app.run()

简化版template.html

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <div class="container">
      % block content %% endblock %
    </div>
  </body>
</html>

魔法就在child1.html:

% extends 'template.html' %
% block content %
  % if task == 'content1' %
    <!-- include content1.html -->
  % endif %
  % if task == 'content2' %
    <!-- include content2.html -->
  % endif %
% endblock %

代替cmets:

<!-- include content1.html -->

我有很多 html 文本,很难跟踪更改并且不犯一些错误,然后很难找到和纠正。

我只想加载content1.html,而不是全部写入child1.html

我遇到了this question,但我在实现它时遇到了问题。

我认为 Jinja2 可能有更好的工具。

注意:上面的代码可能无法正常工作,我只是为了说明问题而写的。

【问题讨论】:

【参考方案1】:

使用 jinja2 % include % 指令。

% extends 'template.html' %
% block content %
    % if task == 'content1' %
        % include 'content1.html' %
    % endif %
    % if task == 'content2' %
        % include 'content2.html' %
    % endif %
% endblock %

这将包括正确内容文件中的内容。

【讨论】:

【参考方案2】:

您可以使用include 语句。

【讨论】:

【参考方案3】:

我想添加使用include的正确语法,上面给出的一个很好,但是当涉及到路径时,花了一些时间才找到这个,官方文档中甚至没有提到它。

包含的语法是:

% include 'path_to_template_file' %

【讨论】:

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

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

如何在模块中包含 *.py 以外的文件?

如何在单独的 js 文件中使用访问 django 模板变量,而不是在同一个 html 文件中包含小脚本块?

如何在子模板中包含部分模板

如何在网站上的所有页面中包含带有 css 的模板

如何在播放框架模板的 html 标记中包含一段 java 代码?