在Jinja2中,何时应该使用宏并何时使用包括?

时间:2014-03-09 19:39:37

标签: templates flask jinja2

在Jinja2中,宏和包含似乎完全相同。

e.g。

{% 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 }}">

为了澄清它们的用途:

  1. 是否有人会工作,而另一个人不会工作?
  2. 如果两者都有效,我们何时应该优先选择其中一种呢?

1 个答案:

答案 0 :(得分:2)

如果目标只是包含一个文本块,那么macroinclude会提供相同的目标。但是在您的示例中,macro更灵活,可用于传递参数并使用它们。

回答问题

  1. 严格来说,一个人不会在另一个人没有的地方工作。但是include确实需要一些灵活性。例如,如果我想使用include语句显示表单的几个不同字段,那么很难做到。我必须为每个字段制作不同的模板文件并单独包含它们,因为它们不能接受参数,这会破坏目的。

  2. 如果你有一大堆代码,你认为应该出现在另一个模板中,只是为了更好的组织,它不需要采取任何参数,例如页眉,页脚,复杂的导航菜单等那么include对这种情况有好处。但是当你有一些东西会重复多次并且可能需要一些动态参数时,例如表单字段,然后您应该使用macro