[Zope] List within a list - how to use in a page template

David H bluepaul at earthlink.net
Wed Dec 14 03:03:50 EST 2005


David H wrote:

> Paul Winkler wrote:
>
>>On Wed, Dec 14, 2005 at 06:06:21PM +1300, Cameron Beattie wrote:
>>  
>>
>>>I am trying to get my head around representing a list in a page template.
>>>
>>>Assume the following list:
>>>    
>>>
>>>>>>m
>>>>>>          
>>>>>>
>>>[[61282125371L, 1, 6, 0], [61282125379L, 1, 6, 0], [61282825240L, 6, 6, 0], 
>>>[61282125378L, 1, 6, 0], [61282125374L, 1, 6, 0]
>>>    
>>>
>>>>>>m[0]
>>>>>>          
>>>>>>
>>>[61282125371L, 1, 6, 0]
>>>    
>>>
>>>>>>m[0][0]
>>>>>>          
>>>>>>
>>>61282125371L
>>>
>>>i.e. m is a list where each member is itself a list.
>>>
>>>How do I get a page template to render a particular item? Assume a function 
>>>getem returns the list.
>>><tal:block repeat="m python:here.getem()">
>>>   <td tal:repeat="single m" tal:content="single"></td>
>>>
>>>This code will produce four columns and five rows, with each populated by 
>>>the list members. But what if I only want the first and third members in 
>>>each case i.e. 2 columns and five rows?
>>>
>>>I thought it would be something like tal:content="python:single[0]" but 
>>>that gives me an unsubscriptable object error.
>>>    
>>>
>>
>>That's because, in your example, each time through the loop,
>>single is an int. Try indexing m instead.
>>
>>  
>>
> I think all thats needed is a tal:condition (he wants to filter out rows)
>
> 1)<span tal:define="res python: context.pyTest();"   <--- returns list 
> of lists  like [[61282125371L, 1, 6, 0], [61282125379L, 1, 6, 0], 
> [61282825240L, 6, 6, 0]]                 tal:repeat="r1 res">
> 3)    <tal:span tal:repeat = "r2 r1"
> 4)        tal:condition="python: repeat.r2.number in (1,2,4)"
> 5)        tal:content="r2">
> 6) </tal:span>
>
> Where 4 is not brain dead as in my example.
>
> David
>
>
>
>
>
Ok, its best to parse your list of lists in a python script.  You pass a 
tuple (or array) of inclusionary index numbers.  It will return the 
filtered list of lists  The problem with the try I gave before is that 
*condition* is evaluated before *repeat*  :-0

So ...

# python script
# input:  a tuple named tup of index items to include in list of lists, 
eg (1,3) and the list of lists
#example input:  listoflists = [[61282125371L, 1, 6, 0], [61282125379L, 
1, 6, 0], [61282825240L, 6, 6, 0]]
#example tup: (1,3)

ret = []
for i in range(len(listoflists)):
  if i in tup:
    ret.append(x[i])
return ret

Then your ZPT is easy.

David

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/zope/attachments/20051214/16b571eb/attachment.htm


More information about the Zope mailing list