﻿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
35735	For python 3.10+ class property may not be accessible by Django's template system	Fabian Braun		"Prior to python 3.10 class properties were always available through the template system. If you had a class
{{{
class MyClass:
    in_template = True
}}}
you could access the class property in the template through {{ context_value.in_template }}. 

The template system first checks if the class is subscriptable (i.e. tries context_value[""in_template""]), will fail with that and then will get the in_template property.

As of Python 3.10 some classes actually are subscriptable and trying to get the item will not fail: Typing shortcuts introduced syntax like `list[int]`. This effectively hides class properties from the template system.

Here's a test (that might go into tests/template_tests/syntax_tests/tests_basic.py) which passes on Python 3.9 and fails on Python 3.10+:
{{{
    @setup({""basic-syntax19b"": ""{{ dict.klass.in_template }}""})
    def test_access_class_property(self):
        class MyClass(list):
            in_template = True

            def __init__(self, non_trivial_init):
                # This prevents the template system from turning the class into an instance
                return super().__init__()

        output = self.engine.render_to_string(""basic-syntax19b"", {""dict"": dict(klass=MyClass)})
        self.assertEqual(output, ""True"")

}}}

I'd be happy to propose a fix."	Uncategorized	new	Template system	5.0	Normal			Fabian Braun	Unreviewed	0	0	0	0	0	0
