Pregunta

Soy un desarrollador front-end, y he estado tratando de obtener una caída en el uso de Jinja2 eficacia. Quiero modificar un sitio actual por lo que tiene varias plantillas de base que utilizan la herencia, que utiliza etiquetas de bloque completamente al contenido sustituto y anularla, y utiliza macros para apoyar paso de argumentos.

Mi plantilla de base contiene el código (editado por simplicidad):

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

Y mis páginas que se extienden que se vea como esto:

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

Así que, básicamente, todas las páginas se extienden de base, lo llaman una macro y pasar argumentos a la macro. No entiendo muy bien todo, pero el punto principal es que esto permite a los valores por defecto y un grado de flexibilidad que no requiere la redefinición de una manzana entera: se da un cierto grado de flexibilidad y potencia. De nuevo, esto está muy simplificado.

El único problema es que esto niega mi capacidad para bloques de uso. Las macros son la flexibilidad, pero con bloques, que tienen la capacidad de anular algo totalmente, o utilizar son los padres los contenidos y añadir a ella, lo que no puedo hacer con macros (al menos no creo). El problema es, no puedo envolver las cosas en bloques, de lo contrario no podrán ver los valores en la macro. Por ejemplo, hacer esto:

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

fallará porque dirá título no está definido.

En última instancia Busco una manera de utilizar tanto el poder como aspectos organiztional de bloques, pero aún así ser capaz de utilizar la lógica y tersura de las macros. Si alguien me podría dar ninguna ayuda en cuanto a cómo podría ir acerca de este problema, yo lo agradecería muchísimo.

¿Fue útil?

Solución

Los bloques sólo son definibles en el nivel superior de una plantilla. Si se extiende una plantilla, los valores establecidos en la plantilla del niño utilizando una etiqueta set serán accesibles desde la plantilla que está ampliando. Por ejemplo, si tiene una plantilla llamada 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>

Y usted tiene esta plantilla hija, index.html:

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

A continuación, la referencia a title en el padre resolvería a 'Homepage'. Esto se puede hacer con cualquier tipo de variable. Por lo que está haciendo, no creo que haya ninguna necesidad de macros - si se toma ventaja de esta característica y colocar bloques bien, usted será capaz de hacer casi todo lo que tiene que hacer en lo que se refiere a los diseños . Me gustaría ver algunas de las plantillas utilizadas por Plurk Solace , que está escrito por uno de los autores Jinja2, si se quiere obtener una buena idea de cuándo utilizar varias características de Jinja2.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top