python - tutorial - ¿Herencia de plantillas de múltiples niveles en Jinja2?
jinja2 ansible (5)
Intenta esto, este trabajo para mí gracias a la respuesta de @Ixm.
base.html
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
{% block content %}{% endblock %}
</body>
</html>
content.html
{% extends "base.html" %}
{% block content %}
<table>
<tr>
{% include "footer.html" %}
</tr>
</table>
{% endblock %}
footer.html
{% block footer %} <td> test</td>{% endblock %}
y llamar con
env = Environment(loader=FileSystemLoader(os.path.join(path, "Layouts")))
template = env.get_template(''content.html'')
html = template.render()
print html
Hago HTML / CSS por comercio, y he estado trabajando dentro y fuera de los proyectos Django como diseñador de plantillas. Actualmente estoy trabajando en un sitio que utiliza Jinja2, que he estado usando durante aproximadamente 2 semanas. Me acabo de enterar leyendo la documentación de que Jinja2 no admite la herencia de plantillas de múltiples niveles, ya que no se puede hacer más de una.
{% extends "foo" %}
por representación. Ahora estoy bastante seguro de que puedes hacer esto en Django, que es poderoso porque puedes especificar una plantilla base, especificar 3 o 4 plantillas basadas en eso, y luego construir la carne de tus páginas usando esas plantillas base. ¿No es el punto de herencia, por lo que tiene más poder de abstraer, de modo que realmente solo está jugando con un código único?
En cualquier caso no tengo ni idea de qué hacer aquí. No sé si hay alguna manera de hacerlo que funcione tan bien como podría con las plantillas de Django. No soy exactamente un experto en Django ni en Jinja (2), pero puedo proporcionar cualquier información necesaria.
La forma en que la documentación lo redactó, parecía que no admitía niveles de herencia (n) profundos.
A diferencia de Python Jinja no admite herencia múltiple. Por lo tanto, solo puede tener una etiqueta extendida llamada por representación.
No sabía que era solo una regla que decía 1 extensión por plantilla ... Ahora lo sé, con algo de ayuda del canal jinja irc.
Recientemente me enfrenté al mismo problema. Quería heredar varias plantillas hijo y funcionó. Para ilustrarlo, me gustaría mostrarle una solución que funcionó para mí:
Tuve un archivo base.html que tiene contenido de bloque y extendido por manage.html. y ese manage.html tiene un sub_manage de bloque que se extiende por internet_market.html, por lo que visualmente parece:
|- base.html (block content)
|--manage.html (extends base.html)
|---sub_manage.html (extends manage.html)
cuando lo procesé, todos pensaron que funcionaba bien, lo que significa que puede tener varios {% extended%} en un render. la única cosa es que si está utilizando enlaces relativos a sus archivos css o js, es posible que no funcione, sino que se procesará, pero no encontrará sus archivos css / js. me gusta:
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css">
<script type="text/javascript" src="../static/js/bootstrap.min.js"></script>
<style type="text/css">
</head>
En ese caso, tienes que usar enlaces dinámicos usando url_for. me gusta:
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="{{url_for("static", filename = "css/bootstrap.min.css")}}">
<script type="text/javascript" src="{{url_for("static", filename = "js/bootstrap.min.js")}}"></script>
<style type="text/css">
Una de las mejores maneras de lograr múltiples niveles de plantillas utilizando jinja2 es usar ''include'', digamos que tienes '' base_layout.html '' como tu plantilla base
<!DOCTYPE html>
<title>Base Layout</title>
<div>
<h1>Base</h1>
.... // write your code here
{% block body %}{% endblock %}
</div>
y luego quieres tener '' child_layout.html '' que extiende ''base_layout.
{% include "base_layout.html" %}
<div>
... // write your code here
</div>
{% block body %}{% endblock %}
y ahora su página solo puede extender '' child_layout.html '' y tendrá tanto base_layout.html como child_layout.html
{% extends "child_layout.html" %}
{% block body %}
...// write your code here
{% endblock %}
Ver la documentación que se extending , including , e importing .
Esto proporciona los medios para obtener la funcionalidad de varios archivos para diferentes propósitos y es diferente de la profundidad del anidamiento. Puede tener perfectamente una plantilla que amplíe una plantilla que amplíe una plantilla ...