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