Opened 8 years ago
Closed 8 years ago
#29306 closed Bug (duplicate)
Prevent template variable lookups from intiatiating a class
| Reported by: | Luoxzhg | Owned by: | Luoxzhg |
|---|---|---|---|
| Component: | Template system | Version: | dev |
| Severity: | Normal | Keywords: | template |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
class A:
def __init__(self, value):
pass
attr="Hello"
from django.template import Template, Context
t = Template(" {{ A.attr }}")
output=t.render(Context({"A": A}))
the output should be "Hello", but it is string_if_invalid, i.e., empty string "" .
Change History (5)
comment:1 by , 8 years ago
| Description: | modified (diff) |
|---|---|
| Summary: | [bugs for all version]Template variable-lookups system evaluate callables before completed the evaluation → [bugs]Template variable-lookups system invoke class when access class attribute |
comment:2 by , 8 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:3 by , 8 years ago
| Easy pickings: | unset |
|---|---|
| Summary: | [bugs]Template variable-lookups system invoke class when access class attribute → Prevent template variable lookups from intiatiating a class |
| Triage Stage: | Unreviewed → Accepted |
comment:4 by , 8 years ago
I understand the desire for the behavior change, however, the change could be backwards incompatible. Consider this case which will pass before the change but fail afterward:
@setup({'t': '{{ A.attr }}'})
def test_class_attribute(self):
"""Accessing an attribute of an instantiated class."""
class A:
def __init__(self):
self.attr = 'Hello'
self.assertEqual(self.engine.render_to_string('t', {'A': A}), 'Hello')
Is there any documentation to suggest the current behavior is incorrect?
comment:5 by , 8 years ago
| Resolution: | → duplicate |
|---|---|
| Status: | assigned → closed |
I think this is expected behaviour, that has a workaround.
#15791 added a check for a do_not_call_in_templates attribute on a callable.
Setting this to True in the example test case allows it to pass.
This is documented in the Variables and lookups section of the Template API docs.
Closing as a duplicate of #15791
PR