在Jinja2中,什么时候应该使用宏,什么时候应该使用include?

cam*_*mil 7 templates jinja2 flask

在 Jinja2 中,宏和包含看起来几乎做同样的事情。

例如

{% macro input(name, value='', type='text') -%}
    <input type="{{ type }}" value="{{ value|e }}" name="{{ name }}">
{%- endmacro %}

{{ input('password', type='password') }} 

-- versus --

{% include 'input.html' %}

input.html file>
<input type="{{ type }}" value="{{ value|e }}" name="{{ name }}">
Run Code Online (Sandbox Code Playgroud)

为了阐明它们的用途:

  1. 是否存在一个时间可以工作而另一个则不工作的情况?
  2. 如果两者都有效,我们什么时候应该选择其中一种而不是另一种?

viv*_*agr 5

如果目标只是包含一段文本,那么macroinclude可以达到相同的目标。但就像在您的示例中一样,macros 更加灵活,可用于传递参数并使用它们。

回答问题

  1. 严格来说,并不是一个可以工作而另一个不能工作的情况。但include确实失去了一些灵活性。例如,如果我想使用语句显示表单的几个不同字段include,那就很难做到。我必须为每个字段制作不同的模板文件并单独包含它们,因为它们无法接受参数,这会达不到目的。

  2. 当您有一段代码,您认为应该存在于不同的模板中以便更好地组织并且不需要任何参数(例如页眉、页脚、复杂的导航菜单等)时,那么就适合这样include做案件。但是,当您的某些内容将重复多次并且可能需要一些动态参数(例如表单字段)时,那么您应该使用macro它。