2015-11-02 140 views
10

我有一个循环,这样删除换行符

{% 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子句被拉伸到一行上,但是该行变得不可读,则可以实现此功能。

回答

4

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_pathother_path是动态的,那么可以使用)
+0

我想,“当然,Django肯定有它的东西”,但不,你需要建立自己的自定义过滤器或做Alasdair显示 – doniyor

+0

@Alasdair,是的,我认为是这样。我想我只需要编写一个模板标签来构建我的URL并保持模板清洁。谢谢,我会接受你的回答! – abudis

6

我需要th同样,因为我使用模板来生成电子邮件主题行(非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()) 

请注意,(故意!)保留所有空白除了换行符。

的电子邮件模板看起来像这样的使用示例,假设上述所谓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 %}指令之后)以防止生成的文件中出现任何换行符。

+0

如果对于我概述的用例来说这听起来不必要的复杂,并且您认为它也可以用一个简单的're.sub(r'\ s * \ n \ s *','',rendered_subject_template)来解决。 strip()'渲染模板后,那么你是绝对正确的。这就是我所做的,我放弃了模板标签,但我仍然认为这可能对其他人在此处发布很有用。 –

+0

我最终编写了一个自定义模板标签并将所有逻辑转移到那里,但我也喜欢您的解决方案。谢谢! – abudis