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 %}tag 在这里是无用的,因为它只去除 和 之间的>空格<。我可以,但我不想将其他段包装在单独的跨度中。在 XSLT 中通常<xsl:text/>用于此目的,Django 模板中的最佳实践是什么?

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 %}

注意将{##}带有换行符和空格的单个 TextNode 在 HTML 标记之前分成三个节点的块:仅空格 TextNode、CommentNode 和带有 HTML 标记的 TextNode。仅包含空格的 TextNode 将被剥离。

于 2012-04-12T06:43:45.553 回答