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子句延伸超过一行,则可以实现,但是该行变得不可读.
我需要相同的,因为我使用模板来生成电子邮件主题行(非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 %}指令之后)以防止生成的文件中出现任何换行符.
该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)
如果在视图中执行此操作不方便,则有另外几个选项:
some_path和other_path是动态的)| 归档时间: |
|
| 查看次数: |
5471 次 |
| 最近记录: |