Varios bloques de mismo nombre en Jinja2
Pregunta
En Jinja2 , tengo una plantilla base como esto:
<title>{% block title %}{% endblock %} - example.com</title>
[...]
<h1>
{% block title %}{% endblock %} - example.com
</h1>
Jinja2, a continuación, falla con el mensaje siguiente:
lines = [self.message, ' ' + location]
: block 'title' defined twice
Debe ser evidente ahora en cuanto a lo que estoy tratando de hacer - tener el mismo título en dos lugares:. La etiqueta del título y la etiqueta H1, pero la parte del título que realmente pueda proveer otras plantillas derivadas
¿Cómo se puede lograr esto normalmente?
Solución
Como se documenta rel="noreferrer"> , definiendo un bloque crea una macro con la nombre del bloque en el objeto especial de "auto":
<title>{% block title %}{% endblock %} - example.com</title>
[...]
<h1>
{{ self.title() }} - example.com
</h1>
Otros consejos
La idea es crear un bloque dentro de una macro y luego llamar macro dos veces, en lugar de tener etiqueta "bloque" repitió dos veces.
En última versión Jinja2 esto funciona:
layout.html
{%- extends "base.html" -%}
{%- macro duplicated() -%}
{% block overrideninchild %}{% endblock %}
{%- endmacro -%}
{% block base_content %}
{{ duplicated() }}
{{ duplicated() }}
{% endblock %}
child_page.html
{%- extends "layout.html" -%}
{% block overrideninchild %}
Should be visible twice.
{% endblock %}