Looks like not all of your dictionaries have description
key.
Instead of directly getting the value by key, use dictionary get() method, that won't throw KeyError
if a key wasn't found:
{% for item in source_data %}
<tr>
<td>{{ item['name'] }}</td>
<td>{{ item.get('description', 'No description') }}</td>
</tr>
{% end %}
Demo:
>>> from tornado import template
>>> source_data = [
... {'name': 'Some name', 'description': 'Description for this item'},
... {'name': 'test'}
... ]
>>> template1 = template.Template("""
... {% for item in source_data %}
... {{ item['description'] }}
... {% end %}
... """)
>>> template2 = template.Template("""
... {% for item in source_data %}
... {{ item.get('description', 'No description found') }}
... {% end %}
... """)
>>> print template1.generate(source_data=source_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "tornado/template.py", line 278, in generate
return execute()
File "<string>.generated.py", line 7, in _tt_execute
KeyError: 'description'
>>> print template2.generate(source_data=source_data)
Description for this item
No description found
Hope that helps.