Удалить разрывы строк из шаблона Django

у меня есть цикл в шаблоне такой

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

, который производит что-то вроде этого

<link hreflang="en-gb" href="http://example.com/
    some_path/ 
    "><link hreflang="de" ...>

можно ли переписать этот код так, чтобы весь тег был написан в одной строке?

<link hreflang="en-gb" href="http://example.com/some_path/">
<link hreflang="de" href="http://example.com/other_path/">
...

P. S. Это может быть достигнуто, если оператор if/else не растягивается за одну линию, а потом линия становится нечитаемым.

2 ответов


на spaceless тег удаляет пробелы между тегами html, невозможно заставить его удалить пробелы внутри тегов, как вы пытаетесь сделать.

вы можете предотвратить новые строки, поместив предложение if/else в одну строку, но, как вы говорите, это затрудняет чтение. Это говорит мне о том, что вы пытаетесь сделать слишком много работы в шаблонах Django, и что URL-адреса должны быть построены в другом месте.

самый простой вариант-построить список (language_code, url) теги в просмотр и цикл через них в шаблоне.

{% for lang_code, url in language_urls %}
    <link hreflang={{ lang_code }} href="{{ url }}">
{% endfor %}

если это не удобно делать в представлении еще несколько вариантов:

  • обработчик контекста шаблона (хорошо, если вы используете те же URL-адреса в каждый посмотреть
  • пользовательский тег/фильтр шаблона (хорошо, если some_path и other_path динамические)

мне нужно то же самое, потому что я использую шаблон для создания строки темы электронной почты (не 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())

обратите внимание ,что это (намеренно!) сохраняет все пробелы за исключением разрывы строк.

An пример использования шаблона электронной почты будет выглядеть так, если предположить, что выше загружено в модуль тегов шаблона 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 %}

отметим, что {% linebreakless %} тег должен быть в первой строке (и после {% load %} директивы), чтобы предотвратить любые разрывы строк в сгенерированном файле.