[Zope] dictionary from sequence-item

David H bluepaul at earthlink.net
Mon Jun 19 15:19:39 EDT 2006


Alric Aneron wrote:

> Hello,
> I am looping through a list of dictionary objects using <dtml-in...
> and within the dtml-in body I have:
> <dtml-var "_.getitem('sequence-item')['titled']" missing="none">
> Some of the dictionaries in the list don't have 'titled' key so it 
> should replace it with the word "none", but it gives me an error
> *Error Type: KeyError*
> *Error Value: 'titled'
> * I don't understand.  Another option is that I can use <dtml-if 
> "_.getitem('sequence-item').has_key('titled')"> but it doesn't work, 
> says has_key is an unknown attribute.  This is the stupidest thing 
> ever! it's a dictionary object!
> I try to typecast it using the 
> dict(_.getitem('sequence-item')).has_key('titled') it gives me an 
> error saying it can't typecast, but I am 100% sure it's a dictionary 
> object because I can access it easily 
> _.getitem('sequence-item')['titled'] for those that have that key.
>
> Any idea how I can check if the titled key is in the dictionary for 
> the current list item?
>
> Thanks in advance guys!
>
> ------------------------------------------------------------------------

Alric,

Your earlier post indicated that your DTML obtains the sequence of 
dictionaries from a python script - and *then* tries to filter it and 
process it. 

Why not do your filtering, e.g. appending only thoses values that have a 
key == 'key1' in your python script first?  Thats why "god" invented 
python scripts :-) .

And as Jonathan indicated, you should also simplify the list returned.  
I would just return a list of filtered values, e.g.

# -----------------------------------------------
# python script (based on your earlier message)
# -----------------------------------------------

#  DTML call to this script can pass these as parameters or obtain them 
from the request ...
mydict = {'key1': 'value1', 'key2': 'value2'}
mydict2 = {'key1': 'value3', 'key2': 'value4'}
desired_key = 'key1'

#results bucket
finalList = []
for dict in (mydict,mydict2):  # we avoid returning list of dictionaries 
which can be awkward  in DTML
  for k in dict.keys():
     if k == desired_key:   # <------- filter it here so DTML doesn't 
have to
        finalList.append( dict[ k ] )

return finalList

Now your DTML is simple. 

David




-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/zope/attachments/20060619/808c90c6/attachment.htm


More information about the Zope mailing list