Opened 7 months ago
Last modified 5 months ago
#35417 closed Bug
RequestContext.new creates a context that cannot be flattened — at Version 1
Reported by: | Lily Foote | Owned by: | nobody |
---|---|---|---|
Component: | Template system | Version: | 5.0 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
In InclusionNode.render Django creates a new_context
from two existing contexts (context
and _dict
) by calling new_context = context.new(_dict)
. These can both be instances of RequestContext
leading to new_context
also being a RequestContext
(I have not tried with any other context types). However, calling new_context.flatten()
raises a ValueError
:
ValueError: dictionary update sequence element #0 has length 1; 2 is required
I can reproduce this in a small test:
from django.template.context import RequestContext from django.test import RequestFactory, TestCase class RequestContextTestCase(TestCase): def test_flatten_request_context_new(self): factory = RequestFactory() request = factory.get("/foo/") context = RequestContext(request) context_2 = RequestContext(request) context_3 = context.new(context_2) self.assertEqual( context_3.flatten(), {"False": False, "None": None, "True": True} )
I discovered this when running Kolo on a Django admin view (http://127.0.0.1:8000/admin/auth/user/). Kolo calls context.flatten()
internally when introspecting a template during rendering, which leads to this exception:
Traceback (most recent call last): File "/home/lily/work/kloppindustries/kolo/python/src/kolo/profiler.py", line 170, in __call__ frame_data = processor.process( ^^^^^^^^^^^^^^^^^^ File "/home/lily/work/kloppindustries/kolo/python/src/kolo/plugins.py", line 107, in process data.update(self.process_extra(frame, event, arg, self.context)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/lily/work/kloppindustries/kolo/python/src/kolo/filters/django.py", line 89, in process_django_template template_context = template_context.flatten() ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/lily/.local/share/lilyenv/virtualenvs/kolo-sandbox/3.12/lib/python3.12/site-packages/django/template/context.py", line 120, in flatten flat.update(d) ValueError: dictionary update sequence element #0 has length 3; 2 is required