From ed36a5f2cefcb5a055ec2ec0a275825226ee601a Mon Sep 17 00:00:00 2001 From: Karen Tracey Date: Mon, 22 Mar 2010 19:08:04 +0000 Subject: [PATCH] Fixed #12554 again: Corrected regression in silencing attribute lookups introduced in r12823, plus added a test for this so it doesn't regress again. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12834 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/template/__init__.py | 5 +++++ tests/regressiontests/templates/tests.py | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/django/template/__init__.py b/django/template/__init__.py index eee0808b5d..0cd42cf0eb 100644 --- a/django/template/__init__.py +++ b/django/template/__init__.py @@ -745,6 +745,11 @@ class Variable(object): 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 diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 303c365cc8..95bb45de43 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -101,6 +101,11 @@ class SilentGetItemClass(object): def __getitem__(self, key): raise SomeException +class SilentAttrClass(object): + def b(self): + raise SomeException + b = property(b) + class UTF8Class: "Class whose __str__ returns non-ASCII data" def __str__(self): @@ -471,8 +476,9 @@ class Templates(unittest.TestCase): # regression test for ticket #12554 # make sure a silent_variable_failure Exception is supressed - # on dictionary lookup + # on dictionary and attribute lookup 'basic-syntax28': ("{{ a.b }}", {'a': SilentGetItemClass()}, ('', 'INVALID')), + 'basic-syntax29': ("{{ a.b }}", {'a': SilentAttrClass()}, ('', 'INVALID')), # List-index syntax allows a template to access a certain item of a subscriptable object. 'list-index01': ("{{ var.1 }}", {"var": ["first item", "second item"]}, "second item"),