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

119

我正在使用 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可能有更好的工具来解决这个问题。

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


我应该用什么替换 'content1'?我已经用不带扩展名的文件名替换了它。如果这是正确的,那么它并没有起作用。我试图将两个HTML文件封装在一个列表中 [% include ['content1.html, content2.html ]'],但这也不起作用,只会取第一个,这很明显。有什么想法吗? - M K Sundaram
3个回答

237

使用jinja2 {% include %} 指令。

{% extends 'template.html' %}
{% block content %}
    {% if task == 'content1' %}
        {% include 'content1.html' %}
    {% endif %}
    {% if task == 'content2' %}
        {% include 'content2.html' %}
    {% endif %}
{% endblock %}
这将包括来自正确内容文件的内容。

22

6

我希望为使用“include”添加正确的语法。以上给出的一个语法是有效的,但是在路径方面可能需要一些时间才能找到,而且它甚至没有在官方文档中提到。

“include”的语法如下:

{% include 'path_to_template_file' %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接