diff options
| author | Anubhav Joshi <anubhav9042@gmail.com> | 2014-07-26 16:30:54 +0530 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2014-07-31 09:13:55 -0400 |
| commit | 0dd05c9e66ebb5cb97136f84373f43582783e1a6 (patch) | |
| tree | 6a84f8e6ccfe011ff9a91ddfe443088fc6104417 | |
| parent | 9d9f0acd7e245c9f9c30727a003666618754c924 (diff) | |
Fixed #16383 -- Raised the AttributeError raised in property of an object when used in a template.
Thanks maraujop for the report and Hiroki and Tim Graham for review.
| -rw-r--r-- | django/template/base.py | 5 | ||||
| -rw-r--r-- | tests/template_tests/tests.py | 11 |
2 files changed, 13 insertions, 3 deletions
diff --git a/django/template/base.py b/django/template/base.py index 5615478ea5..b0b15e4a38 100644 --- a/django/template/base.py +++ b/django/template/base.py @@ -773,7 +773,10 @@ class Variable(object): if isinstance(current, BaseContext) and getattr(type(current), bit): raise AttributeError current = getattr(current, bit) - except (TypeError, AttributeError): + except (TypeError, AttributeError) as e: + # Reraise an AttributeError raised by a @property + if isinstance(e, AttributeError) and not isinstance(current, BaseContext) and bit in dir(current): + raise try: # list-index lookup current = current[int(bit)] except (IndexError, # list index out of range diff --git a/tests/template_tests/tests.py b/tests/template_tests/tests.py index 0d83f38950..d5ee85fce2 100644 --- a/tests/template_tests/tests.py +++ b/tests/template_tests/tests.py @@ -110,13 +110,17 @@ class SomeClass: raise SomeOtherException raise KeyError + @property def silent_fail_attribute(self): raise SomeException - silent_fail_attribute = property(silent_fail_attribute) + @property def noisy_fail_attribute(self): raise SomeOtherException - noisy_fail_attribute = property(noisy_fail_attribute) + + @property + def attribute_error_attribute(self): + raise AttributeError class OtherClass: @@ -820,6 +824,9 @@ class TemplateTests(TestCase): 'filter-syntax23': (r'1{{ var.noisy_fail_key }}2', {"var": SomeClass()}, (SomeOtherException, SomeOtherException)), 'filter-syntax24': (r'1{{ var.noisy_fail_attribute }}2', {"var": SomeClass()}, (SomeOtherException, SomeOtherException)), + # #16383 - A @property that raises AttributeError should not fail loudly. + 'filter-syntax25': ('{{ var.attribute_error_attribute }}', {"var": SomeClass()}, (AttributeError)), + ### COMMENT SYNTAX ######################################################## 'comment-syntax01': ("{# this is hidden #}hello", {}, "hello"), 'comment-syntax02': ("{# this is hidden #}hello{# foo #}", {}, "hello"), |
