Удалить разрывы строк из шаблона 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 %}
директивы), чтобы предотвратить любые разрывы строк в сгенерированном файле.