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