/ / Sangría del motor de plantillas de Django - django, django-templates, sangrado

Sangría del motor de plantillas de Django: django, django-templates, sangrado

Estoy teniendo dificultades para intentar que el motor de plantillas de Django sangre correctamente al extender / incluir plantillas

estos archivos:

index.html

<html>
<body>
<div id="hello">
{% block bar %}
{% endblock %}

{% include "baz.html"%}
</div>
</body>
</html>

bar.html

{% extends "foo.html" %}

{% block bar %}
<p>bar</p>
{% endblock %}

baz.html

<p>baz</p>

se renderizará como

<html>
<body>
<div id="hello">
<p>bar</p>
<p>baz</p>
</div>
</body>
</html>

¿Cómo puedo solucionarlo para que se muestre como

<html>
<body>
<div id="hello">
<p>bar</p>
<p>baz</p>
</div>
</body>
</html>

Introducir pestañas manualmente no es una opción. Estoy usando pestañas suaves (4 espacios) si alguna vez esto es importante.

Respuestas

6 para la respuesta № 1

La sangría no se inserta automáticamente por la herencia de plantilla de Django. Para lograr la sangría que deseas, deberías incluirla en bar.html:

{% extends "foo.html" %}

{% block bar %}
<p>bar</p>
{% endblock %}

2 para la respuesta № 2

Debe explicar con cuál es el propósito de sus necesidades de sangría.

La sangría es muy útil en el paso de depuración, pero la sangría no es compatible con la optimización, porque existe sin espacio filtrar.

Puedes escribir tu propio recortado:

@register.tag
def myinden(parser, token):
args = token.contents.split()
n = args[1]
nodelist = parser.parse(("endmyinden",))
parser.delete_first_token()
return MyIndenNode(nodelist, n)

class MyIndenNode(Node, n):
def __init__(self, nodelist, n):
self.nodelist = nodelist
self.n = n

def render(self, context):
import re
regex = re.compile("^", re.M)
return re.sub(regex, "t"*int(self.n),
self.nodelist.render(context).strip())

Al uso:

index.html
{% include "baz.html" with indentation="8" %}

baz.html
{{ myindent:myindentation }}
...

Aviso, no probado. Además, le sugiero que modifique el fragmento para que funcione solo en modo de depuración:


1 para la respuesta № 3

Puede anular el método de renderizado de NodeList como lo he hecho. Vea mi pregunta con código de trabajo:

¿Una sangría adecuada en las plantillas de Django (sin parches de mono)?


1 para la respuesta № 4

Otra opción de lo mencionado anteriormente es usar el middleware Beautiful Soup.

Aquí hay un tutorial. Tenga en cuenta que las personas llaman a este middleware para ser ``REALMENTE LENTO"" y consejos para almacenar en caché las páginas de salida.