Отступ в шаблонном движке Django

Я с трудом пытаюсь заставить движок шаблонов Django правильно делать отступ при расширении / включении шаблонов

эти файлы:

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>

будет отображаться как

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

Как я могу это исправить, чтобы он выглядел как

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

Ручной ввод вкладок не вариант. Я использую мягкие вкладки (4 пробела), если когда-либо это имеет значение.

4 ответа

Решение

Отступ не вставляется автоматически при наследовании шаблона Django. Чтобы получить отступ, который вы хотите, вам нужно включить его в bar.html:

{% extends 'foo.html' %}

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

Вы должны объяснить с целью ваших потребностей отступа.

Отступы очень полезны на этапе отладки, но отступы несовместимы с оптимизацией, поскольку существует фильтр без пробелов.

Вы можете написать свой собственный разрезанный:

@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())

Для использования:

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

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

Обратите внимание, не проверено. Также я предлагаю вам модифицировать сниппет, чтобы он работал только в режиме отладки:

Вы можете переопределить метод рендеринга NodeList, как я сделал. Смотрите мой вопрос с рабочим кодом:

Правильный отступ в шаблонах Django (без мартышек-патчей)?

Другой вариант из вышеперечисленных - использовать промежуточное ПО Beautiful Soup.

Вот учебник. Обратите внимание, что люди называют это промежуточное ПО " РЕАЛЬНО МЕДЛЕННЫМ" и советуют кэшировать выходные страницы.

Другие вопросы по тегам