【问题标题】:jinja2 load template file from templatejinja2 从模板加载模板文件
【发布时间】:2011-09-07 17:11:19
【问题描述】:

有没有办法从另一个模板文件中加载 jinja2 模板?像

{{ render_template('path/to/file.html') }}

我有一些我想重复使用的 sn-ps,所以拥有这个功能对我来说很重要。

【问题讨论】:

    标签: jinja2


    【解决方案1】:

    {% include "file" %} 这样做。请参阅jinja2 docs 了解更多信息。

    【讨论】:

    • 我阅读了文档,但找不到将template params 传递给include 调用的方法。你能澄清一下是否可能吗?
    • @NamGVU 我不确定这是不是最好的方法,但是对于一个模板,我通过包含机制两次使用嵌套模板来填充同一模板中的两个实例。在包含之前,我定义了一组烧瓶变量作为子模板的形式变量。这些变量的值作为子模板的实际参数,它们是根据我正在创建的父模板的上下文填充的。
    • 检查我的答案,了解如何干净利落地做到这一点。
    • 我也可以使用此语句将css文件包含到html文件中的<style>标签中吗?
    【解决方案2】:

    使用extends 标记或include 标记,具体取决于您希望如何设计多文件视图。

    【讨论】:

      【解决方案3】:

      您应该使用{% macro -%}s 制作模板文件,并使用{% import "file" as file %} 在其他模板文件中使用宏。见the docs.

      这是一个例子:

      <!- in common_macros.html ->
      {% macro common_idiom1(var1, var2, ... varN) -%}
          <!- your idiom, where you can use var1 through varN ->
      {%- endmacro %}
      <!- in my_template.html ->
      {% import "common_macros.html" as idioms %}
      {{ idioms.common_idiom1(a, b, ... N) }}
      

      具体来说,这个答案允许 OP 将参数传递给他的宏,类似于他想要的行为,比如 render_template 的行为方式(仅仅包括文件,因为前面的答案已经说明上面没有实现与 render_template 相同的行为)。

      这通常比为每个习语制作新模板或使用继承要好,后者是一种特殊情况的解决方案(如果您想在一个模板中多次使用 sn-p 怎么办)?

      【讨论】:

      • 在重新阅读 OP 的问题后,我意识到当我偶然发现此页面时遇到的问题与 OP 的问题并不完全相同。也就是说,像其他答案所建议的那样,为每个习语制作一个新的模板文件是一种不好的扩展做法。使用继承只是一种特殊情况的解决方案。所以我认为我发布的内容很好,对于未来的读者(就像我刚才一样)。
      猜你喜欢
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2019-11-05
      • 2011-04-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多