我尝试在Zope Page模板中使用TAL创建一个打开的div标签条件,并在另一个条件中关闭一个div标签,但我不允许重叠标签。
下面是我的代码:
<div id="notaccordion">
<tal:x repeat="item python:range(26)">
<tal:x define="global block_name python:current.values()[0]['block_name']">
<tal:x condition="python:isDone">
</div>
</tal:x>
<tal:x condition="python:not isDone">
<tal:x replace="python:block_name">
</tal:x>
<div>
</tal:x>
</tal:x>
</tal:x>
</div> 重要的部分是:
<tal:x condition="python:isDone">
</div>
</tal:x>这就是错误。
Compilation failed
zope.tal.taldefs.TALError: TAL attributes on <tal:x> require explicit </tal:x>我尝试使用Python脚本,但也不起作用。
<div id="notaccordion">
<tal:x repeat="item python:range(26)">
<tal:x define="global block_name python:current.values()[0]['block_name']">
<tal:x condition="python:isDone">
<tal:x content="python:context[close_div]()">
</tal:x>
</tal:x>
<tal:x condition="python:not isDone">
<tal:x replace="python:block_name">
</tal:x>
<tal:x content="python:context[open_div]()">
</tal:x>
</tal:x>
</tal:x>
</tal:x>
</div> 使用close_div脚本:
print '</div>'
return printed它返回</div>而不是</div>
如果你想知道我为什么要这么做。我有一个需要显示的树结构。由于我(认为我)不能递归地执行它,所以我尝试使用后进先出列表来模拟它。current是我当前的节点。
我试图做到这一点(节点是字典的字典...用作树):
lifo = list()
lifo.append([node, False])
while lifo:
current, isDone = lifo[-1]
block = current.keys()[0]
if isDone:
print '</div>'
lifo.pop()
else:
lifo[-1][1] = True
print '<div>'
print block
children = current[block].get('children', {})
if children:
for childBlock, childValue in children.items():
lifo.append([{childBlock:childValue}, False])如有任何帮助或建议,欢迎光临
发布于 2013-04-16 17:50:31
页面模板必须是有效的XML,所以你不能随意地包含标签。最好以递归方式处理树结构(可能使用宏代码段):
<metal:recurse define-macro="list">
<ul>
<li tal:repeat="el elements">
<span tal:content="el/id">element id</span>
<metal:block tal:condition="el/children"
tal:define="elements el/children">
<div metal:use-macro="template/macros/list" />
</metal:recurse>
</li>
</ul>
</metal:recurse>例如,Plone导航portlet也为每个级别使用一个separate macro template,调用它自己来呈现子级(recurse是相同的模板)。
对于使用open_div或close_div脚本的特定方法,您需要mark the content value as structure以防止发生自动HTML转义:
<tal:x content="structure python:context[open_div]()">https://stackoverflow.com/questions/16033371
复制相似问题