gpt4 book ai didi

python - Django 模板和空格

转载 作者:太空狗 更新时间:2023-10-29 21:52:15 25 4
gpt4 key购买 nike

我开始使用自定义 inclusion tags在我的 django 模板中。例如,我有一个 {% profilelink profile %} 标签,它插入一个指向用户个人资料的链接以及个人资料图片的小版本,就像这样 (profilelink.html ):

<a href='{% url ... %}'><img src='{{ ... }}' alt='...'> {{ profile.name }}</a>

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

<p>Owned by {% profilelink owner %} (uploaded by {% profilelink uploader %})</p>

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

其中一些问题可以通过 {% spaceless %} 标签解决,但不是全部。此标记仅删除 标记之间的空格,而在上例中并非如此。

一个可能的解决方案是在 profilelink.html 中没有最终的 EOL,但这是非常不可取的。原因:一般是风格不好;一些编辑器(vim)默认默认加一个回来;就是这样POSIX defines a line ;这可能会让一些 SCM 不高兴;等等

另一个解决方案是切换到另一个模板引擎,比如 Jinja2 ,这可能会或可能不会解决此问题。它支持像 {% ... -%} 这样的结构,它吃掉下一个 EOL 字符。这在某些情况下很有用,但对我上面的示例也没有用。但是为了这么小的烦恼而切换模板后端似乎有点矫枉过正并且增加了另一个依赖性。我想坚持使用标准的“django”做事方式。不过,显然有计划让 Jinja2 成为新的 Django 默认值。

有些人建议在将生成的 HTML 发送到浏览器之前使用中间件类从生成的 HTML 中删除多余的空格。这很有用,但仅适用于以功能等效的方式转换 HTML,即相同的语义:它仍然会在浏览器中以相同的方式显示。那不是我想要的,我想要语义上的实际更改以使其正确显示。这在通用中间件类中是不可能实现的。我需要根据具体情况从模板本身内部对此进行控制。我不关心让 HTML 更漂亮,我关心的是它首先是正确的。

还有 bug #2594它已作为 WONTFIX 关闭,参数为(引用)“Django 模板语言足以生成 HTML,它对空格不敏感”。在我看来,这是完全错误的。 HTML 对空格非常敏感,它不在乎有多少空格。它非常关心是否有空格或根本没有空格。

我的一些问题是:一般来说,有什么理智的方法可以解决这个问题吗? (一个总是有效的,而不仅仅是在某些情况下。)

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

最佳答案

我相信一个解决方案是使用 simple_tag而不是包含标签,希望没有太多困惑。

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

@register.inclusion_tag('profilelink.html')
def profilelink(user):
return {"profile": user}

是否可以将其替换为

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()

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

关于python - Django 模板和空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37837674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com