2011-02-15 3 views
9

Je comprends le concept, mais je ne comprends pas la syntaxe.Je ne comprends pas Jinja2 Call Blocks

Je vais utiliser le example utilisé sur leur site

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

Quelle sera la sortie? Sous-question (parce que je suis confus sur comment cela fonctionne): Êtes-vous autorisé à avoir seulement 1 appelant par macro?

Répondre

10

C'est la sortie:

<div class="dialog"> 
    <h2>Hello World</h2> 
    <div class="contents"> 

    This is a simple dialog rendered by using a macro and 
    a call block. 

    </div> 
</div> 

Alors, quand nous appelons render_dialog nous passons « Bonjour tout le monde », comme le titre, quand il atteint caller() passe le contenu du bloc call.

+0

Cool. Eh bien, qu'est-ce qui fait que d'appeler une macro dans une autre macro? –

+0

Vous pouvez considérer une macro comme une fonction dans un langage traditionnel. Le bloc d'appel est juste une invocation de cette fonction. – Marii

+1

J'ai trouvé qu'avec une macro imbriquée exécutant 'caller()' dans la macro imbriquée a donné une erreur, puisqu'aucune donnée d'appelant ne lui avait été passée. Ce que je voulais réellement, c'était les données passées à la macro parent. J'ai été capable d'obtenir ceci par, dans la macro externe, en faisant '{% set content = caller()%}' et ensuite dans la macro interne en utilisant '{{content}}'. – tremby