2

コードフォーマットの問題があります。文字列のシーケンスを出力する必要があり、印刷された文字列の間にスペースを入れないでください(実際には単語をセグメントごとに印刷し、タイプミスを強調表示しているため)が、コードをインデントして読みやすくする方法が少し混乱しています。問題は、コードを特定すると、改行とスペースが出力の一部になることです。

<b>{% for sub in segment.details %}{% if sub.is_marked %}<u>{{sub.text}}</u
>{% else %}{{sub.text}}{% endif %}{% empty %}{{ segment.text }}{% endfor %}</b>

明らかに、タグはと{% spaceless %}の間のスペースを取り除くだけなので、ここでは役に立ちません。できましたが、他のセグメントを別々のスパンでラップしたくありません。XSLTでは、通常、この目的で使用しますが、Djangoテンプレートの場合のベストプラクティスは何ですか?><<xsl:text/>

UPD:私の最終的な解決策を別の回答として以下に投稿しました。

4

3 に答える 3

3

テンプレートのコメントタグ内にはいつでも改行を入れることができます。

<b>{% for sub in segment.details %}{# 
     #}{% if sub.is_marked %}{#
        #}<u>{{sub.text}}</u>{#
        #}{% else %}{{sub.text}}{#
     #}{% endif %}{#
     #}{% empty %}{{ segment.text }}{#
   #}{% endfor %}</b>
于 2012-04-10T19:34:09.310 に答える
3

必要に応じて削除するタグを作成できます。最近、私のすべての django プロジェクトには、このようなもの用の templatetags ディレクトリがあります。それは、時間/読みやすさのIMOで非常に迅速に元が取れます。私の最も一般的なタグは、プロジェクト間で共有されています。

最近のバージョンでは、シンプルなタグの作成が非常に簡単になったため、今ではワークフローに取り入れています (これとは関係ありませんが...)。

@register.tag
def remove_whitespace(parser, token):
    nodelist = parser.parse(('endremove_whitespace',))
    parser.delete_first_token()
    return RemoveSpaces(nodelist)

class RemoveSpaces(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist
    def render(self, context):
        output = self.nodelist.render(context)
        return ''.join(output.split()) # modify behavior if desired

{% load mytags %}
{% remove_whitespace %}
<b>All whitespace stripped</b>
{% endremove_whitespace %}
于 2012-04-10T20:20:11.397 に答える
0

完全を期すために、最終的な解決策を投稿することにしました。

strip_spacenodesタグのコード:

def _strip__space__text_nodes(nodelist):
    for node in nodelist:
        if isinstance(node, template.TextNode):
            if not node.s.strip():
                node.s = ''
        else:
            for list_ in node.child_nodelists:
                _strip__space__text_nodes(getattr(node, list_, ()))

class StripSpaceNodes(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist
        _strip__space__text_nodes(nodelist)
    def render(self, context):
        return self.nodelist.render(context)

@register.tag
def strip_spacenodes(parser, token):
    nodelist = parser.parse(('endstrip_spacenodes',))
    parser.delete_first_token()
    return StripSpaceNodes(nodelist)

使用法:

{% strip_spacenodes %}
    {% for segment in segments %}
        {% if segment.is_marked %}
            {##}<b>{##}
                {% for sub in segment.details %}
                    {% if sub.is_marked %}
                        {##}<u>{{sub.text}}</u>{##}
                    {% else %}
                        {{sub.text}}
                    {% endif %}
                {% empty %}
                    {{ segment.text }}
                {% endfor %}
            {##}</b> {##}
        {% else %}
            {{ segment.text }}
        {% endif %}
    {% endfor %}
{% endstrip_spacenodes %}

{##}HTML タグの前に改行とスペースを含む単一の TextNode を 3 つのノード (スペースのみの TextNode、CommentNode、および HTML タグ付きの TextNode) に分割するブロックに注意してください。スペースのみを含む TextNode は削除されます。

于 2012-04-12T06:43:45.553 に答える