首页 > 解决方案 > 您可以在 Flask/Jinja 中创建组件以插入到各种模板中吗

问题描述

假设我做了一个非常酷的搜索框布局,我想重用它

例如。

<div class='someClass'>
    <input class='fancyInput'>
</div>

是否可以像在模板上扩展一样,在其他模板中重用该片段,但可以说是“导入”一个片段。就像 `{% extend %} 的保留

我想拥有可以重复使用但根据页面插入不同区域的 html 块。

目前,每次我想使用该 HTML 块时,我都必须对其进行硬编码。

这是一个伪 html/jinja 示例

片段

{% component fancyInput %} # not real jinja

<div class='someClass'>
    <input class='fancyInput'>
</div>

{% endcomponent %}

然后让我们在某处的随机页面上说

<html>
<body>
    <div class='container'><p>Some text!</p></div>
    {% import component fancyInput}
</body>
</html>

呈现的 HTML 将是

<html>
<body>
    <div class='container'>
        <p>Some text!</p>
    </div>
    <div class='someClass'>
        <input class='fancyInput'>
    </div>
</body>
</html>

标签: pythonjinja2

解决方案


Jinja2使用宏。一旦定义了宏,就可以调用它来渲染元素。

因此,如果您在模板中定义宏,例如:

  {% macro newComponent(text) -%}
      <div class='container'><p>{{text}}</p></div>
  {%- endmacro %}

然后可以在任何文件中调用它

{{ newComponent('Insert Text') }}

这是文档的链接

还有 Stack Overflow 上关于宏的帖子 使用 Jinja2 (Flask) 模板引擎的参数化可重用块


推荐阅读