Opened 19 months ago
Last modified 17 months ago
#35417 closed Bug
RequestContext.new creates a context that cannot be flattened — at Initial Version
| 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
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