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




_______________________________________________
Zope maillist  -  Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope-dev )

Reply via email to