如何避免在基本模板中呈现块 - 或者:如何定义多行块状变量?
How to avoid rendering a block in a base template - or: how to define a multiline block-like variable?
我对神社比较陌生,所以请原谅这个可能很愚蠢的问题...
我在名为 lib.jinja
的文件中有一个 jinja 宏,如下所示
{% macro some_macro(some_content) %}
<div class="some_class">{{ some_content }}</div>
{%- endmacro %}
我从另一个名为content.htm
的文件导入,大致如下:
{% from "lib.jinja" import some_macro %}
{% block content %}
Some content
{% endblock %}
{{ some_macro(self.some_macro(self.content())) }}
呈现的输出如下所示:
Some content
<div class="some_class">Some content</div>
请注意,内容出现两次,一次呈现 through/by 宏,另一次 - 直接在上方 - 呈现为在 content.htm
中名为内容的块中定义的内容。我很想避免该块被渲染两次 - 它应该被送入宏并仅通过它渲染。
我似乎可以 "work around" 通过将 content.htm
转换为空基本模板的子模板(通过在其顶部添加 extends
标记)。
也许我对这里的概念缺乏理解:块不是变量 - 我明白了。如果没有 extends
标签,我认为该模板将被视为基本模板。如果没有子模板或其他指令,我想该块只是按原样呈现,然后可以说是第二次被宏拾取 - 对吗?
我怎样才能以理智的方式解决这个问题,即除了扩展一个空的基本模板之外,我该如何处理这个问题?是否有其他类型的块或变量可以满足我的需要?
就在我提交这个问题之后,我终于在手册中找到了我要找的东西:Block Assignments。
{% from "lib.jinja" import some_macro %}
{% set content %}
Some content
{% endset %}
{{ some_macro(self.some_macro(content)) }}
set
和 endset
标签解决了我的问题。
我对神社比较陌生,所以请原谅这个可能很愚蠢的问题...
我在名为 lib.jinja
的文件中有一个 jinja 宏,如下所示
{% macro some_macro(some_content) %}
<div class="some_class">{{ some_content }}</div>
{%- endmacro %}
我从另一个名为content.htm
的文件导入,大致如下:
{% from "lib.jinja" import some_macro %}
{% block content %}
Some content
{% endblock %}
{{ some_macro(self.some_macro(self.content())) }}
呈现的输出如下所示:
Some content
<div class="some_class">Some content</div>
请注意,内容出现两次,一次呈现 through/by 宏,另一次 - 直接在上方 - 呈现为在 content.htm
中名为内容的块中定义的内容。我很想避免该块被渲染两次 - 它应该被送入宏并仅通过它渲染。
我似乎可以 "work around" 通过将 content.htm
转换为空基本模板的子模板(通过在其顶部添加 extends
标记)。
也许我对这里的概念缺乏理解:块不是变量 - 我明白了。如果没有 extends
标签,我认为该模板将被视为基本模板。如果没有子模板或其他指令,我想该块只是按原样呈现,然后可以说是第二次被宏拾取 - 对吗?
我怎样才能以理智的方式解决这个问题,即除了扩展一个空的基本模板之外,我该如何处理这个问题?是否有其他类型的块或变量可以满足我的需要?
就在我提交这个问题之后,我终于在手册中找到了我要找的东西:Block Assignments。
{% from "lib.jinja" import some_macro %}
{% set content %}
Some content
{% endset %}
{{ some_macro(self.some_macro(content)) }}
set
和 endset
标签解决了我的问题。