3

使用 chameleon 时,我可以使用插槽的概念从基本模板中替换元素。您在其中定义一个插槽并使用另一个标签填充它。由于 head 中没有容器元素,如何向 head 中添加元素?:

布局文件

<html>
<head>
  <div metal:define-slot="extra_head"></div>
</head>
<body>
  ...
</body>
</html>

需要指定额外头部的内容模板。

<html metal:use-macro="load: main.pt">
<div metal:fill-slot="extra_head">
  <script type="text/javascript" src="http://example/script.js"></script>
</div>
...
</html>

这将呈现在:

<html>
<head>
  <div metal:fill-slot="extra_head">
    <script type="text/javascript" src="http://example/script.js"></script>
  </div>
</head>
<body>
  ...
</body>
</html>

但是 head 中没有容器标签,那么如何定义一个插槽来在 head 中添加东西呢?

4

2 回答 2

3

有一种替代方法tal:omit-tag(我发现它令人烦恼地令人困惑 - 我不止一次花了很多时间试图弄清楚为什么某个标签在模板中明确存在时没有出现在输出中,只是发现它tal:omit-tag整齐地隐藏在远角):如果您使用带有tal:metal:命名空间的 xml 标签,它们将不会出现在输出中:

<html>
    <head>
        <metal:my-slot define-slot="extra_head"></metal:my-slot>
    </head>
    <body>
        ...
    </body>
</html>

在子模板中:

<metal:template use-macro="load: main.pt">
    <metal:any-descriptive-name fill-slot="extra_head">
        <script type="text/javascript" src="http://example/script.js"></script>
    </metal:any-descriptive-name>
    ...
</metal:template>

请注意模板如何变得更具可读性和自我描述性,并且不包含诸如<div>内部之类的奇怪事物<head>:)

使用命名空间标签时,您还可以省略属性的前缀tal:和前缀,因此metal:

<h1 tal:condition="..." tal:content="..." tal:omit-tag="">Hi there! Bogus content for added confusion!</h1>

变成

<tal:greeting condition="..." content="..." />
于 2013-12-09T23:39:29.920 回答
1

要删除标签,必须使用 tal:omit-tag :

在内容模板中,使用:

<html metal:use-macro="load: main.pt">
<div metal:fill-slot="extra_head" tal:omit-tag="">
  <script type="text/javascript" src="http://example/script.js"></script>
</div>
...
</html>

div 不是结果的一部分。阅读文档

于 2013-12-09T17:21:24.597 回答