In Jinja2, come posso utilizzare le macro in combinazione con i tag di blocco?
-
21-09-2019 - |
Domanda
Sono uno sviluppatore front-end, e ho cercato di ottenere un blocco di utilizzare in modo efficace Jinja2. Voglio ottimizzare un sito corrente in modo da ha più modelli di base utilizzando l'ereditarietà, utilizza pienamente i tag blocco di sostituire il contenuto e sovrascrivere, e utilizza le macro per sostenere passaggio di argomenti.
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 estendo simile a questa:
{% 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 gli argomenti a quella macro. Io non capisco tutto, ma il punto principale è che questo consente valori di default e un grado di flessibilità che non richiede ridefinire un intero blocco: dà un certo grado di flessibilità e potenza. Anche in questo caso è fortemente semplificata.
L'unico problema è che questo nega la mia capacità di utilizzare i blocchi. Le macro sono per la flessibilità, ma con blocchi, ho la possibilità di ignorare qualcosa di completamente, o utilizzare il suo contenuto genitori e aggiungi ad essa, che non posso fare con le macro (almeno non credo). Il problema è, non posso avvolgere le cose in blocchi, altrimenti non vedranno i valori nella macro. Per esempio, facendo questo:
{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}
non riuscirà perché si dirà titolo non è definito.
In definitiva Sto cercando un modo per utilizzare sia il potere e gli aspetti organiztional di blocchi, ma comunque in grado di utilizzare la logica e la concisione delle macro. Se qualcuno mi potrebbe dare alcun aiuto su come potrei andare su questo problema, sarei davvero grato.
Soluzione
I blocchi sono solo definibili a livello superiore di un modello. Se si estende un modello, tutti i valori impostati nel modello bambino con un tag set
saranno accessibili dal modello 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 si dispone di 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 risolverebbe a 'Homepage'
. Lo si può fare con qualsiasi tipo di variabile. Per quello che stai facendo, non credo che ci sia alcun bisogno di macro - se approfittare di questa caratteristica e posto blocchi bene, si sarà in grado di fare praticamente tutto quello che dovete fare per quanto riguarda i layout sono preoccupati . Vorrei guardare alcuni dei modelli utilizzati da Plurk Solace , che è scritto da uno degli autori Jinja2, se si vuole ottenere una buona idea di quando per utilizzare diverse funzioni di Jinja2.