Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模板:格式化不应包含空格的控件结构_Python_Django_Django Templates - Fatal编程技术网

Python Django模板:格式化不应包含空格的控件结构

Python Django模板:格式化不应包含空格的控件结构,python,django,django-templates,Python,Django,Django Templates,我有一个代码格式问题。我需要输出一个字符串序列,并且打印的字符串之间应该没有空格(因为我实际上是按段打印单词,突出显示打字错误),但是我有点困惑如何缩进代码以使其可读。问题是,当我识别代码时,换行符和空格成为输出的一部分 <b>{% for sub in segment.details %}{% if sub.is_marked %}<u>{{sub.text}}</u >{% else %}{{sub.text}}{% endif %}{% empty %}

我有一个代码格式问题。我需要输出一个字符串序列,并且打印的字符串之间应该没有空格(因为我实际上是按段打印单词,突出显示打字错误),但是我有点困惑如何缩进代码以使其可读。问题是,当我识别代码时,换行符和空格成为输出的一部分

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

显然,
{%spaceless%}
标记在这里是无用的,因为它只会去除
之间的空格。您可以始终将换行符放在模板注释标记中:

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

您可以制作一个标签,根据需要进行剥离-最近,我所有的django项目都有一个templatetags目录,用于类似的内容。在时间/可读性方面,它很快就能为自己支付费用。我最常用的标签是在项目之间共享的

最近的版本使简单的标签创建变得非常容易,这就是为什么现在它出现在我的工作流程中(尽管这与此无关…)

@register.tag
def remove_空格(解析器、令牌):
nodelist=parser.parse(('endremove_whitespace',))
parser.delete_first_token()
返回远程空间(节点列表)
类RemoveSpace(template.Node):
定义初始化(自我,节点列表):
self.nodelist=节点列表
def呈现(自身、上下文):
输出=self.nodelist.render(上下文)
返回“”。join(output.split())#根据需要修改行为
{%load mytags%}
{%remove_whitespace%}
删除所有空白
{%endremove_空白%}

为了完整起见,我决定发布我的最终解决方案:

strip\u 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 %}
{%strip\u spacenodes%}
{段%中的段的百分比}
{%if segment.u标记为%}
{##}{##}
{segment.details%中的子项的%s}
{%if sub.u标记为%}
{}{{sub.text}{{
{%else%}
{{sub.text}}
{%endif%}
{%empty%}
{{segment.text}
{%endfor%}
{##} {##}
{%else%}
{{segment.text}
{%endif%}
{%endfor%}
{%endstrip_spacenodes%}

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

{{{35;}
是单行注释,但一般来说,任何
{}
构造都不应包含换行符,否则它将被渲染为应用了此技术,而是使用
{%comment%}{%endcomment%}
我决定使用您建议的方法。虽然我实际上不想从输出中删除空格,但只在空格标记节点中删除文本。@newtover,太好了!你介意展示一下你是如何处理这些节点的吗?我把我的解决方案作为一个单独的答案发布了。
{% 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 %}