2010-01-20 7 views
10

Sono uno sviluppatore front-end e ho cercato di capire come usare Jinja2 in modo efficace. Voglio modificare un sito corrente in modo che abbia più modelli di base che utilizzano l'ereditarietà, utilizza completamente tag di blocco per sostituire il contenuto e sovrascriverlo, e utilizza macro per supportare il passaggio di argomenti.In Jinja2, come posso utilizzare macro in combinazione con tag di blocco?

Il mio modello di base contiene questo codice (a cura per semplicità):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd"> 
{% from "foo.html" import macro1, macro2, macro3 %} 
{% macro base_template(title=none, arg2=none, urls={}, arg3=false) %} 
<html> 
    <title>{{ title }} | Site.com</title> 
    .... 
    {{ caller() }} 
    .... 
</html> 
{% endmacro %} 

{% block content %}{% endblock %} 

E le mie pagine che si estendono apparire come questo:

{% extends "base.html" %} 
{% block content %} 
{% call base_template(title="home", arg2="active", arg3="true") %} 
(html code here) 
{% endcall %} 
{% endblock %} 

Quindi, in pratica tutte le pagine si estendono di base, che chiamano una macro e passare argomenti a quella macro. Non capisco tutto, ma il punto principale è che questo consente valori predefiniti e un grado di flessibilità che non richiede la ridefinizione di un intero blocco: offre un certo grado di flessibilità e potenza. Ancora una volta questo è molto semplificato.

L'unico problema è che questo annulla la mia capacità di utilizzare i blocchi. I macro sono per la flessibilità, ma con i blocchi, ho la possibilità di sovrascrivere qualcosa completamente, o usarne il contenuto dei genitori e aggiungerlo, cosa che non posso fare con i macro (almeno non credo). Il problema è che non riesco a racchiudere le cose nei blocchi, altrimenti non vedranno i valori nella macro. Per esempio, facendo questo:

{% block title %}<title>{{ title }} | Site.com</title>{% endblock %} 

fallirà perché dirà titolo non è definito.

In definitiva, sto cercando un modo per utilizzare sia la potenza e gli aspetti organizzativi dei blocchi, ma ancora essere in grado di utilizzare la logica della macro di macro &. Se qualcuno potesse darmi un aiuto su come potrei andare su questo problema, lo apprezzerei molto.

risposta

20

I blocchi sono definibili solo al livello superiore di un modello. Se si estende un modello, qualsiasi valore impostato nel modello secondario utilizzando un tag set sarà accessibile dal modello che si sta estendendo. Ad esempio, se si dispone di un modello denominato layout.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <title>{{ title }} | Site.com</title> 
    .... 
    {% block content %}{% endblock content %} 
    .... 
</html> 

e hai questo template figlio, index.html:

{% extends "layout.html" %} 
{% set title = 'Homepage' %} 
{% block content %} 
(html code here) 
{% endblock content %} 

Poi il riferimento alla title nel genitore sarebbe risolvere a 'Homepage'. Puoi farlo con qualsiasi tipo di variabile. Per quello che stai facendo, non penso che ci sia bisogno di macro: se sfrutti questa funzionalità e piazzi bene i blocchi, sarai in grado di fare praticamente tutto ciò che devi fare per quanto riguarda i layout . Vorrei esaminare alcuni dei modelli usati da Plurk Solace, che è scritto da uno degli autori di Jinja2, se volete avere una buona idea su quando utilizzare le varie funzionalità di Jinja2.

+1

Ho intenzione di provare questo adesso, anche se indipendentemente dal fatto che funzioni bene o no, grazie per l'aiuto, apprezzarlo molto. Dare un'occhiata al link di bitbucket che hai fornito. – xckpd7

+0

Wow, non hai assolutamente idea di quanto mi abbia aiutato. Ora sono in grado di utilizzare i blocchi come override master, ma ho delle variabili impostate su tutta la mia base e posso impostare un dizionario per sovrascrivere qualsiasi di esse, esattamente quello che volevo. Grazie per tutto il vostro aiuto! – xckpd7

Problemi correlati