将模板字符串传递给 Jinja 宏

Spa*_*ide 6 python jinja2 flask

我想从宏渲染模板字符串。我尝试使用以下宏来执行此操作,该宏使用 呈现模板{{ comment|safe }},但模板中的变量(例如,按{{ name }}字面呈现而不是使用name. 如何在宏参数中允许可变数据?

{% macro comment_el(image_url, name, comment) %}
  <div class="media no-border-top">
    <div class="media-left">
      <a href="{{ outgoing_url }}" >
        <img class="media-object" src="{{ image_url }}" />
      </a>
    </div>
    <div class="media-body">
      <h4 class="media-heading"><a href="{{ outgoing_url }}" >{{ name }}</a></h4>
      <p>{{ comment|safe }}</p>
    </div>
  </div>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
{{ comment_el(
    url_for("static", filename="img/c01.jpg"),
    "Some Name",
    "This comment is amazing. All I want to say is that {{ name }} is an amazing person"
) }}
Run Code Online (Sandbox Code Playgroud)

输出:

<p>This comment is amazing. All I want to say is that {{ name }} is an amazing person</p>
Run Code Online (Sandbox Code Playgroud)

Thi*_*ter 16

那是不可能的。

但是,您可以使用callerin Jinja 宏来传递块:

{% macro comment_el(image_url, name) %}
    ...
    <div class="media-body">
      <p>{{ caller() }}</p>
    </div>
    ...
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

{% call comment_el(url_for("static", filename="img/c01.jpg"), "Some Name") -%}
    This comment is amazing. All I want to say is that {{ name }} is an amazing person 
{%- endcall %}
Run Code Online (Sandbox Code Playgroud)

相关文档:http : //jinja.pocoo.org/docs/2.9/templates/#call


解决它的另一种选择是:

{% set comment -%}
    This comment is amazing. All I want to say is that {{ name }} is an amazing person
{%- endset %}
{{ comment_el(url_for("static", filename="img/c01.jpg"),
    "Some Name",
    comment
) }}
Run Code Online (Sandbox Code Playgroud)

相关文档:http : //jinja.pocoo.org/docs/2.9/templates/#block-assignments


为了完整起见,您还可以使用格式:

{{ comment_el(url_for("static", filename="img/c01.jpg"),
"Some Name",
"This comment is amazing. All I want to say is that %s is an amazing person" | format(name)
) }}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供如此高质量的答案。您的贡献使 SO 成为一个伟大的社区 (2认同)