2012-07-25 56 views
0

我对Zope和Plone很新颖。我正在尝试在index_html页面中编写python代码。我有人类的对象列表,现在我想对它们重新排序。所以,我收到了:如何在zope页面模板中编写python代码

<ul tal:define="persons python: context.portal_catalog(portal_type='Person');"> 
<tal:listing repeat="p persons"> 

现在我有<tal:listing在此之前的Python代码...

<?python 
    order=[0,2,1] 
    persons = [persons[i] for i in order] 
?> 

但不知为何的人的顺序保持不变。另外,我也不喜欢这种在视图中编写python代码的方式。有什么办法可以使用这段代码来改变列表的顺序吗?

+0

''语法根本不受Zope页面模板的支持。你在哪里找到这个语法? – 2012-07-25 13:44:23

+0

我从www.mail-archive.com/[email protected]/msg00046.html找到它。我意识到,如果我将这些人更改为python代码中的new_persons并尝试在中访问它,它不知道这个new_person!我想我应该在其他地方写这个python代码。目前我正在将它写入浏览器模板!我应该在哪里编写此代码,以及如何在模板上访问此代码? – 2012-07-25 13:47:27

+1

啊,这是有人*问*的功能,而不是描述ZPT可以做什么。 :-) – 2012-07-25 13:49:17

回答

4

Zope的pagetemplates不支持<? ?>语法可言。

但是,你也可以遍历在tal:repeat你的Python列表就好了:不过

<ul tal:define="persons python: context.portal_catalog(portal_type='Person');"> 
    <tal:listing repeat="i python:[0, 2, 1]"> 
     <li tal:define="p python:persons[i]" tal:content="p/name">Person name</li> 
    </tal:listing> 
</ul> 

我怀疑,你想让portal_catalog来排序,而不是使用sort_on参数(见在Plone KB article on the catalog):

<ul tal:define="persons python: context.portal_catalog(portal_type='Person', sort_on='sortable_title');"> 
    <tal:listing repeat="p persons"> 
     <li tal:content="p/name">Person name</li> 
    </tal:listing> 
</ul> 

如果你想做的任何事情更复杂,使用browser view做按摩名单为您。

+0

谢谢你的回答! – 2012-07-25 13:56:58

+0

但是,在视图中处理逻辑是否是一种很好的做法?你在哪里定义Person.py类中的“sortable_title”? – 2012-07-25 14:08:51

+0

最好将逻辑推送到视图,但少量的排序等可以在模板中处理。 – 2012-07-25 14:12:03