15

テンプレートを拡張/含めるときに、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

4 に答える 4

7

インデントは、Djangoテンプレートの継承によって自動的に挿入されません。あなたが望むインデントを達成するために、あなたはそれを中に含める必要があるでしょうbar.html

{% extends 'foo.html' %}

{% block bar %}
            <p>bar</p>
{% endblock %}
于 2013-01-04T11:49:13.907 に答える
4

インデントのニーズの目的を説明する必要があります。

インデントはデバッグステップで非常に役立ちますが、スペースレスフィルターが存在するため、インデントは最適化と互換性がありません。

あなたはあなた自身の切り取ったものを書くことができます:

@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 }}
...

注意してください、テストされていません。また、デバッグモードでのみ機能するようにスニペットを変更することをお勧めします。

于 2013-01-04T12:26:59.863 に答える
1

私が行ったように、NodeListのrenderメソッドをオーバーライドできます。動作するコードに関する私の質問を参照してください。

Djangoテンプレートの適切なインデント(モンキーパッチなし)?

于 2013-08-19T09:34:12.490 に答える
1

上記の別のオプションは、BeautifulSoupミドルウェアを使用することです。

これがチュートリアルです。人々はこのミドルウェアを「本当に遅い」と呼び、出力ページをキャッシュするようアドバイスしていることに注意してください。

于 2014-11-22T21:00:44.053 に答える