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

123 投票
3 回答
136988 浏览
提问于 2025-04-18 01:19

我正在使用Flask这个小型框架来搭建我的服务器,它使用Jinja模板。

我有一个父模板叫做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 %}

而不是那些注释:

<!-- include content1.html -->

我有很多HTML文本,跟踪这些变化非常困难,而且很容易出错,这些错误之后又很难找到和修正。

我希望能直接加载content1.html,而不是把所有内容都写在child1.html里。

我看到过这个问题,但在实现的时候遇到了一些问题。

我觉得Jinja2可能有更好的工具来解决这个问题。

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

3 个回答

7

我想补充一下使用include的正确写法,上面提到的那种写法没问题,但在路径方面,我花了一些时间才找到这个,官方文档里甚至没有提到。

include的写法是:

{% include 'path_to_template_file' %}
23

你可以使用 include 这个语句。

242

使用 jinja2 的 {% include %} 指令。

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

这样可以把正确的内容文件里的内容包含进来。

撰写回答