使用TAL、Chameleon和Pyramid重复元素时遇到问题

1 投票
1 回答
2451 浏览
提问于 2025-04-17 05:29

我在让TAL和Chameleon/Pyramid一起工作时遇到了很大的困难……

我在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 个回答

5

奇怪。我觉得这个应该能正常工作。

不过,你在这里使用的 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>

在 Chameleon 中, python: 也是多余的。然后,你可以在模板中使用属性访问,而不是字典访问:

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

也许在这个过程中,你还会顺便解决你真正的问题。 ;-)

撰写回答