﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
12554	silent_variable_failure not suppressing exception during dict lookup	Thomas Steinacher <tom@…>	nobody	"Example:

{{{
from django.template import Context, Template

class E(Exception): silent_variable_failure = True

class A(object):
	def __getitem__(self, key):
		raise E

t = Template(""{{ a.b }}"")

t.render(Context({""a"": A()}))
}}}

According to Django docs, the exception should be suppresed and an empty string should be returned. However, instead, Django raises the exception:

{{{
---------------------------------------------------------------------------
TemplateSyntaxError                       Traceback (most recent call last)

/home/user/user/<ipython console> in <module>()

/usr/lib/python2.5/site-packages/django/template/__init__.pyc in render(self, context)
    176     def render(self, context):
    177         ""Display stage -- can be called many times""
--> 178         return self.nodelist.render(context)
    179 
    180 def compile_string(template_string, origin):

/usr/lib/python2.5/site-packages/django/template/__init__.pyc in render(self, context)
    777         for node in self:
    778             if isinstance(node, Node):
--> 779                 bits.append(self.render_node(node, context))
    780             else:
    781                 bits.append(node)

/usr/lib/python2.5/site-packages/django/template/debug.py in render_node(self, node, context)
     79             wrapped.source = node.source
     80             wrapped.exc_info = exc_info()
---> 81             raise wrapped
     82         return result
     83 

TemplateSyntaxError: Caught an exception while rendering: 

Original Traceback (most recent call last):
  File ""/usr/lib/python2.5/site-packages/django/template/debug.py"", line 71, in render_node
    result = node.render(context)
  File ""/usr/lib/python2.5/site-packages/django/template/debug.py"", line 87, in render
    output = force_unicode(self.filter_expression.resolve(context))
  File ""/usr/lib/python2.5/site-packages/django/template/__init__.py"", line 546, in resolve
    obj = self.var.resolve(context)
  File ""/usr/lib/python2.5/site-packages/django/template/__init__.py"", line 687, in resolve
    value = self._resolve_lookup(context)
  File ""/usr/lib/python2.5/site-packages/django/template/__init__.py"", line 713, in _resolve_lookup
    current = current[bit]
  File ""<ipython console>"", line 4, in __getitem__
E
}}}

Proposed patch:

{{{
Index: django/template/__init__.py
===================================================================
--- django/template/__init__.py (revision 11929)
+++ django/template/__init__.py (working copy)
@@ -745,11 +745,11 @@
                             TypeError,  # unsubscriptable object
                             ):
                         raise VariableDoesNotExist(""Failed lookup for key [%s] in %r"", (bit, current)) # missing attribute
-                except Exception, e:
-                    if getattr(e, 'silent_variable_failure', False):
-                        current = settings.TEMPLATE_STRING_IF_INVALID
-                    else:
-                        raise
+            except Exception, e:
+                if getattr(e, 'silent_variable_failure', False):
+                    current = settings.TEMPLATE_STRING_IF_INVALID
+                else:
+                    raise
 
         return current
}}}"		closed	Template system	dev		fixed			Accepted	1	0	0	1	0	0
