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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top