Django模板和空白

jlh*_*jlh 7 python django django-templates

我开始在我的django模板中使用自定义包含标记.例如,我有一个{% profilelink profile %}标签,用于插入用户配置文件的链接以及配置文件图片的小版本,如下所示(profilelink.html):

<a href='{% url ... %}'><img src='{{ ... }}' alt='...'> {{ profile.name }}</a>
Run Code Online (Sandbox Code Playgroud)

但是,当我在以下代码段(sometemplate.html)中使用它时:

<p>Owned by {% profilelink owner %} (uploaded by {% profilelink uploader %})</p>
Run Code Online (Sandbox Code Playgroud)

然后我在第二个模板标签生成的HTML和右括号之间得到空格. 这个空白是不受欢迎的.它来自profilelink.html文件中的最终换行符.这是一个非常常见的问题,搜索Stackoverflow会产生很多关于模板中空格的问题.以下是迄今为止发现的解决方案的摘要以及它们不起作用的原因:

其中一些问题可以通过{% spaceless %}标签解决,但不是所有问题都可以解决.此标记仅删除标记之间的空格,而上例中的情况并非如此.

一种可能的解决方案是在profilelink.html中没有最终的EOL,但这是非常不受欢迎的.理由:风格一般不好; 一些编辑器(vim)默认默默地添加一个; 这就是POSIX定义一条线的方式 ; 它可能会使一些SCM不满意; 等等

另一种解决方案是切换到另一个模板引擎,如Jinja2,它可能会也可能不会解决这个问题.它支持{% ... -%}使用下一个EOL角色的构造.这在某些情况下很有用,但对我上面的例子也没用.但是,为了这么小的烦恼而切换模板后端似乎有点矫枉过正,并增加了另一种依赖性.我想坚持任何标准的"django"做事方式.显然,有计划将Jinja2作为新的Django默认值.

有些人建议使用中间件类从生成的HTML中删除多余的空格,然后再将其发送到浏览器.这很有用,但仅用于以功能相同的方式转换HTML,即相同的语义:它仍然会在浏览器中以相同的方式显示.这不是我想要的,我希望在语义上进行实际的改变,以使其正确显示.这在通用中间件类中是不可能实现的.我需要在模板本身内逐个控制这个.我不关心让HTML更漂亮,我首先关心它是正确的.

还有一个错误#2594已被关闭为WONTFIX与参数(引用)"Django模板语言足以生成HTML,它对空白不敏感".在我的观点中,这是完全错误的.HTML对空白非常敏感,它并不关心它有多少.它关心是否有一些空白或根本没有空白.

我的一些问题是:是否有任何理智的方法来解决这个问题?(总是有效的,不仅仅是在某些情况下.)

(任何基于CSS的修复都不算数.复制/粘贴意外是邪恶的.)

Mar*_*lén 3

我相信一种解决方案是使用 asimple_tag而不是包含标签,希望不会太混乱。

我假设你的标签是这样的:

@register.inclusion_tag('profilelink.html')
def profilelink(user):
    return {"profile": user}
Run Code Online (Sandbox Code Playgroud)

是否可以用这个代替

from django.template.loader import render_to_string

@register.simple_tag
def profilelink(user):
    t = render_to_string("profilelink.html", {"profile": user})
    return t.strip()
Run Code Online (Sandbox Code Playgroud)

我现在没有 Django 项目,所以这是未经测试的。