Opened 3 weeks ago

Last modified 3 weeks ago

#35417 new Bug

RequestContext.new creates a context that cannot be flattened

Reported by: Lily Foote Owned by: nobody
Component: Template system Version: 5.0
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Lily Foote)

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

This is similar to #24765 and #26041.

Change History (4)

comment:1 by Lily Foote, 3 weeks ago

Description: modified (diff)

comment:2 by Lily Foote, 3 weeks ago

Investigating a bit more, this also applies to Context and RenderContext.

comment:3 by Sarah Boyce, 3 weeks ago

Triage Stage: UnreviewedAccepted
Type: UncategorizedBug

Replicated (thank you for the test case) and also confirmed Context and RenderContext, thank you!

comment:4 by Sarah Boyce, 3 weeks ago

Component: UncategorizedTemplate system
Note: See TracTickets for help on using tickets.
Back to Top