Jinja2:说“在另一个宏或模板中渲染这个宏”

Posted

技术标签:

【中文标题】Jinja2:说“在另一个宏或模板中渲染这个宏”【英文标题】:Jinja2: saying 'Render this macro inside another macro or template' 【发布时间】:2013-03-25 16:28:49 【问题描述】:

我想在一个通用容器宏或模板中呈现许多宏。用伪代码:

宏1

宏2

宏3

容器

在模板中:

"render macro1 inside of Container" e.g.  macro1 with Container 

我不想每次都通过渲染Container然后里面的宏,我只需要指定,当这个宏被另一个宏包围时

我认为 'call' (http://jinja.pocoo.org/docs/templates/#macros) 是我正在寻找的,但我现在不太明白。任何意见,如果不清楚,我如何澄清这一点。

【问题讨论】:

【参考方案1】:

这对我有用:

% macro _enclosure() %
    <div id="topenclosure">hello I'm on top</div>
         caller() 
    <div id="bottomenclosure">hello I'm on the bottom</div>
% endmacro %

% macro account_user_profile_macro(i) %
    % call _enclosure() %
        i.__dict__
    % endcall % 
% endmacro %

【讨论】:

似乎对我不起作用 :-( ``` % call host(_host) % TypeError: 宏 'host' 被调用时使用了特殊调用者参数的两个值。这很可能是错误。``` github.com/pallets/jinja/issues/678#issuecomment-277043879 我通过将caller() 放入每个宏来解决。【参考方案2】:

来自documentation:

在某些情况下,将一个宏传递给另一个宏会很有用。为此,您可以使用特殊调用块。以下示例显示了一个利用调用功能的宏以及如何使用它:

% macro render_dialog(title, class='dialog') -%
    <div class=" class ">
        <h2> title </h2>
        <div class="contents">
             caller() 
        </div>
    </div>
%- endmacro %

% call render_dialog('Hello World') %
    This is a simple dialog rendered by using a macro and
    a call block.
% endcall %

【讨论】:

以上是关于Jinja2:说“在另一个宏或模板中渲染这个宏”的主要内容,如果未能解决你的问题,请参考以下文章

Flask学习

Flask快速入门

009.Ansible模板管理 Jinja2

在 Jinja2 中,如何测试变量是不是未定义?

webapp2 + jinja2:如何让 uri_for() 在 jinja2-views 中工作

怎样保存渲图