从Jinja2宏中访问外部变量

时间:2014-07-09 12:14:54

标签: macros jinja2

我有以下Jinja2文件,但宏do_stuff似乎无法访问something中定义的something_elsemy_template.jinja2的值}。

有没有办法让这成为可能?我知道我可以手动将它们传递给宏,但是因为它们的值在模板文件中每次调用宏时保持不变,所以不必这样做就好了。

如果我将宏直接嵌入my_template.jinja2它可以工作,但是它必须在使用它的所有模板中重复。

macro.jinja2

{% macro do_stuff(value) %}
     <p>Something is {{ something | default('nothing') }}.</p>
     <p>Something else is {{ something_else | default ('nothing') }}.</p>
     <p>Values is {{ value }}.</p>
{% endmacro %}

base_template.jinja2

{% from 'macros.jinja2' import do_stuff %}
{# Other common stuff goes here #}

my_template.jinja2

{% extends 'base_template.jinja2' %}

{% set something = "foo" %}
{% set something_else = "bar" %}

{# Content #}
{{ do_stuff("baz1") }}
{# More content #}
{{ do_stuff("baz2") }}
{# More content #}
{# etc. #}

2 个答案:

答案 0 :(得分:0)

我找不到办法做到这一点,最后每次只传递默认参数:

<强> macro.jinja2

{% macro do_stuff(something, something_else, value) %}
    <p>Something is {{ something | default('nothing') }}.</p>
    <p>Something else is {{ something_else | default ('nothing') }}.</p>
    <p>Values is {{ value }}.</p>
{% endmacro %}

<强> my_template.jinja2

{% extends 'base_template.jinja2' %}

{% set something = "foo" %}
{% set something_else = "bar" %}

{# Content #}
{{ do_stuff(something, something_else, "baz1") }}
{# More content #}
{{ do_stuff(something, something_else, "baz2") }}
{# More content #}
{# etc. #}

答案 1 :(得分:0)

在导入中使用with context

{% from 'macros.jinja2' import do_stuff with context%}

请参见Access Macro Context in Jinja2