从Django模板中删除换行符

abu*_*dis 10 django django-templates

我在这样的模板中有一个循环

{% spaceless %}
{% for lang_code, lang_name in LANGUAGES %}
    <link hreflang={{ lang_code }} href="http://example.com/
    {% if lang_code|length > 2 %}
        {{ some_path }}
    {% else %}
        {{ other_path }}
    {% endif %}
    ">
{% endfor %}
{% endspaceless %}
Run Code Online (Sandbox Code Playgroud)

产生这样的东西

<link hreflang="en-gb" href="http://example.com/
    some_path/ 
    "><link hreflang="de" ...>
Run Code Online (Sandbox Code Playgroud)

是否可以重写这段代码,以便将整个标记写在一行中?

<link hreflang="en-gb" href="http://example.com/some_path/">
<link hreflang="de" href="http://example.com/other_path/">
...
Run Code Online (Sandbox Code Playgroud)

PS如果if/else子句延伸超过一行,则可以实现,但是该行变得不可读.

Hen*_*ger 8

我需要相同的,因为我使用模板来生成电子邮件主题行(非HTML,因此{% spaceless %}没用).就我而言,模板采用了许多不同的案例,所有内容都必须在一行中写入超过500个字符.

所以在{% spaceless %}我的心态中,我写了自己的{% linebreakless %}:

import six
from django import template
from django.template.base import Node
from django.utils.functional import allow_lazy


register = template.Library()


@register.tag
def linebreakless(parser, token):
    nodelist = parser.parse(('endlinebreakless',))
    parser.delete_first_token()
    return LinebreaklessNode(nodelist)


class LinebreaklessNode(Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist

    def render(self, context):
        strip_line_breaks = allow_lazy(lambda x: x.replace('\n', ''), six.text_type)
        return strip_line_breaks(self.nodelist.render(context).strip())
Run Code Online (Sandbox Code Playgroud)

请注意它(故意!)保留换行符之外的所有空格.

电子邮件模板的示例用法如下所示,假设上面的内容被加载到名为的模板标记模块中linebreakless.py:

{% load linebreakless %}{% linebreakless %}

{# Email subjects are (encoded) text, not HTML, so we don't need any autoescaping! #}
{% autoescape off %}

New Notification
 •
{% if flag %}
 about this
{% else %}
 about that
{% endif %}
!

{% endautoescape %}
{% endlinebreakless %}
Run Code Online (Sandbox Code Playgroud)

请注意,{% linebreakless %}标记必须位于第一行(并且在{% load %}指令之后)以防止生成的文件中出现任何换行符.

  • 该标签在 Django 3.0 中不再起作用。用“keep_lazy”替换“allow_lazy”似乎还不够。所以我现在将使用更简单的正则表达式。 (2认同)

Ala*_*air 5

spaceless标签会删除 html 标签之间的空格,无法像您尝试的那样删除标签内的空格。

您可以通过将 if/else 子句放在一行上来防止换行,但正如您所说,这使得它难以阅读。这向我表明您试图在 Django 模板中做太多工作,并且应该在其他地方构建 url。

最简单的选择是(language_code, url) 在视图中构建一个标签列表,并在模板中循环遍历这些标签。

{% for lang_code, url in language_urls %}
    <link hreflang={{ lang_code }} href="{{ url }}">
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

如果在视图中执行此操作不方便,则有另外几个选项:

  • 一个模板上下文处理器(如果你在每个视图中使用相同的 url 就很好)
  • 一个自定义的模板标签/过滤器(好,如果some_pathother_path是动态的)