我正在开展金字塔项目,正在考虑将来会有的事情。我的特殊用例是提升资源树来构建一个面包屑,但我对一般实现也很好奇。
在Python代码中,我想要这个:
while resource is not None:
pass # do something with resource
resource = resource.__parent__
但在变色龙中,你只能获得tal:repeat
,这是一个for
循环。我可以感觉到你可以编写一个可以提供给模板的函数:
def ascend(resource):
while resource is not None:
yield resource
resource = resource.__parent__
然后可以将其用作tal:repeat="item ascend(resource)"
。
这可能会推广到while循环:
def while_(value, condition, suite):
while condition(value):
yield value
value = suite(value)
用法:tal:repeat="item while_(resource, lambda resource: resource is not None, lambda resource: resource.__parent__)"
。丑陋。我觉得你很快就会专攻!
同样,如果支持break
,则无限for
循环可以。但事实并非如此。 (我认为,支持它也不是明智之举。
有没有更好或更简单的方法来实现这一目标? (一般情况或我的具体情况。)
答案 0 :(得分:3)
不,没有。
变色龙模板并不意味着实现复杂的逻辑;原始的Zope页面模板的理念是将所有业务逻辑留给Python代码,模板具有足够的能力将生成的信息转换为演示文稿,仅此而已。
这就是为什么Chameleon不会给你任何东西而不是for循环;遍历复杂结构的模板不是它的责任,它的责任仅限于创建已经处理过的数据的表示。