RandomB
RandomB

Reputation: 3749

Chameleon/TAL/ZPT template problem in tal:repeat

I am trying to use Chameleon Template for Python (it's based on Zope TAL/METAL language). This simple template raises error (dic is dictionary in the list):

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

I tried dic.index, dic.item.index, repeat.index, repeat.item.index but all of them looks wrongly. What is the right syntax to access looping item index?

Upvotes: 0

Views: 259

Answers (1)

RandomB
RandomB

Reputation: 3749

Documentation is outdated, right expression is repeat['variable'].index like here:

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

Upvotes: 2

Related Questions