tal:repeat中的Chameleon / TAL / ZPT模板问题

时间:2019-06-25 16:13:30

标签: python chameleon zpt

我正在尝试将Chameleon模板用于Python(它基于Zope TAL / METAL语言)。这个简单的模板会引发错误(dic是列表中的词典):

    <tr tal:repeat="dic myitems">
        <span tal:omit-tag="" tal:repeat="pair dic.items()">
            <td tal:content="pair[1 if dic.index else 0]"></td>
        </span>
    </tr>
AttributeError: 'dict' object has no attribute 'index'

 - Expression: "pair[1 if dic.index else 0]"
 - Filename:   <string>
 - Location:   (line 21: col 33)
 - Arguments:  repeat: {...} (0)
               dic: {...} (11)
               with_nginx_distribution: <list - at 0x7f30b34b20e0>
               pair: <tuple - at 0x7f30b36c7b90>
               css: \n.tabs {\n  position: relative;   \n  min-height: 20...
               target_language: <NoneType - at 0x7f30b46ade00>

我尝试了dic.indexdic.item.indexrepeat.indexrepeat.item.index,但是它们看起来都错了。访问循环项索引的正确语法是什么?

1 个答案:

答案 0 :(得分:0)

文档已过时,正确的表达式为repeat['variable'].index,如下所示:

from chameleon import PageTemplate

tmpl = '''
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n">

<table border="1">
<tr tal:repeat="d xxx">
<td tal:repeat="p d.items()">
<span tal:omit-tag="" tal:content="p[1 if repeat['d'].index else 0]"></span>
</td>
</tr>
</table>

</html>
'''

template = PageTemplate(tmpl)
data = {"xxx": [
    {"name": "John", "age": 30},
    {"name": "Michael", "age": 34}
]}
print(template(**data))