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.
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
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