【问题标题】:Reuse a block of code in several places in jinja2在jinja2的几个地方复用一段代码
【发布时间】:2014-01-22 06:02:04
【问题描述】:

我有这个 html sn-p 需要在 jinja2 模板中的很多地方使用:

<div class="usedalot">{{  somevalue }}</div>

例如,在 template1.html、template2.html 中。 template3.html,这段代码重复了好几处

<!-- template1.html, template2.html. template3.html -->
<div class="usedalot">{{  somevalue }}</div>
......
<div class="usedalot">{{  somevalue }}</div>
....
<div class="usedalot">{{  somevalue }}</div>
......

有没有办法把这段代码sn-p用作块,而不是复制和粘贴? jinja2 模板继承(带块)似乎没有解决这个问题。

【问题讨论】:

    标签: flask jinja2


    【解决方案1】:

    您要查找的内容称为macro

    宏被放置在单独的文件中(例如,macros.html)。

    {% macro usedalot(somevalue) %}
        <div class="usedalot">{{ somevalue }}</div>
    {% endmacro %}
    

    然后您可以在其他模板中导入您的宏

    {% from 'macros.html' import usedalot %}
    

    然后在需要时使用它们

    {{ usedalot(1) }}
    

    这将输出

    <div class="usedalot">1</div>
    

    【讨论】:

    • 这实在是太难看了。我的意思是,如果您的论点是1,它看起来没问题。如果你的论点是一大段 HTML 怎么办?
    • 为什么要在模板的字符串文字中定义 HTML?这听起来像是代码异味。
    • 没有。我是说,我不想那样做。问题是:我该怎么做?看这里stackoverflow.com/questions/45113110/…
    【解决方案2】:

    从 Jinja 2.8 开始,您现在还可以使用块分配将块(仍然只能定义一次)映射到可以在文档中多次使用的变量。

    文档位于:Block assignments

    我刚刚使用该功能将我的 HTML 页面标题块放入 title 元素以及 Facebook 的 opengraph:title 属性的元属性中。

    {% set title_s %}{% block title %}MY DEFAULT TITLE{% endblock %}{% endset %}
    <head>
    <meta property="og:title" content="{{ title_s }}" />
    <title>{{ title_s }}</title>
    ...
    </head>
    

    在我看来,这比定义宏要干净得多。

    【讨论】:

    • 这应该是公认的答案。 2019 年与 Flask 一起在这里工作得很好:)
    • 这是一个很好的解决方案。我不相信块分配需要 {% block title %} {% endblock %}
    • 这只是在多个地方使用了一个变量。我认为 James 是在追求可重用/可参数化的代码块。某事。就像你可以像一个带变量的函数一样调用。
    • 正是我所需要的——简单并且允许变量参数化。我必须在其中使用一个块才能使其正常工作,就像描述的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多