麻烦使用TAL,Chameleon和Pyramid重复元素

时间:2011-11-02 13:37:42

标签: python pyramid chameleon template-tal

我真的很难让TAL和Chameleon / Pyramid玩得很好。 。 。

我在金字塔中有一个视图,例如返回以下内容:

def view(request):
    return {'results' : [ {'name':'alice', 'value':22}, 
                          {'name':'bob', 'value':11},
                          {'name':'charlie', 'value':33} ] }

我有一个包含以下HTML格式的模板:

<!DOCTYPE html>
<html>
<head></head>
<body>
<table>
    <thead>
        <tr>
            <td>Keyword</td>
            <td class="center">Mean Position</td>
        </tr>
    </thead>
    <tbody>
        <tr tal:repeat"row results">
            <td>${row.name}</td>
            <td>${row.value}</td>
        </tr>
    </tbody>
</table>
</body>
</html>

我希望HTML输出如下:

<table>
    <thead>
    <tr class="odd">
        <td>Name</td>
        <td class="centre">Age</td>
    </tr>
    </thead>
    <tbody>
        <tr>
            <td>alice</td>
            <td>22</td>
        </tr>
        <tr>
            <td>bob</td>
            <td>11</td>
        </tr>            
        <tr>
            <td>charlie</td>
            <td>33</td>
        </tr>
    </tbody>
</table>

但是,当我尝试运行时,Pyramid会抛出错误:

raise ParseError("Unexpected end tag.", token)
ParseError: Unexpected end tag.
- String:   "</tr>"
我觉得这很奇怪。我删除了结束<\tr>,然后收到以下错误:

NameError: row
- Expression: "python:row['name']"

我真的坚持这个,任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:4)

怪异。我认为这应该有用。

无论如何,你在这里使用tal:replace是错误的,因为它会取代整个标签。您想要的是用tal:content替换标记的内容:

<tr tal:repeat="row results">
    <td tal:content="python:row['name']">the name</td>
    <td tal:content="python:row['value']">1</td>
</tr>

python:在变色龙中也是多余的。然后,您还可以在模板中使用属性访问而不是dict访问:

<tr tal:repeat="row results">
    <td tal:content="row.name">the name</td>
    <td tal:content="row.value">1</td>
</tr>

最后,您可以使用${}替换语法代替tal:content。那会给你一个更紧凑的拼写:

<tr tal:repeat="row results">
    <td>${row.name}</td>
    <td>${row.value}</td>
</tr>

也许,在这样做的同时,你将在途中解决你的实际问题。 ; - )