【问题标题】:Can you create components in Flask/Jinja to insert in various templates您可以在 Flask/Jinja 中创建组件以插入到各种模板中吗
【发布时间】:2019-04-25 03:34:20
【问题描述】:

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

例如。

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

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

的保留

我想要一些可以重复使用的 html 块,但可以根据页面插入到不同的区域。

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

这是一个伪 html/jinja 示例

sn-p

{% 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>

【问题讨论】:

    标签: python jinja2


    【解决方案1】:

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

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

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

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

    {{ newComponent('Insert Text') }}
    

    这是documentation的链接

    还有关于宏的 Stack Overflow 帖子 Parameterized reusable blocks with Jinja2 (Flask) templating engine

    【讨论】:

    • 如果我想在这个宏中包含 JavaScript 并且可以在其他地方重用,我将如何实现?
    【解决方案2】:

    使用include 将整个模板文件包含在您当前的模板中,docs

    文档示例:

    {% include 'header.html' %}
        Body
    {% include 'footer.html' %}
    

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 2012-06-28
      • 2012-03-03
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多