From 8d7b1423f89bcc3df57333fc79fa5aead17b0cbc Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Sun, 17 Nov 2024 16:07:23 +0100 Subject: [PATCH] Refs #35844 -- Fixed copying BaseContext and its subclasses on Python 3.14+. super objects are copyable on Python 3.14+: https://github.com/python/cpython/commit/5ca4e34bc1aab8321911aac6d5b2b9e75ff764d8 and can no longer be used in BaseContext.__copy__(). --- django/template/context.py | 4 +++- tests/template_tests/test_context.py | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/django/template/context.py b/django/template/context.py index 0c28b479cd..90825fcdb5 100644 --- a/django/template/context.py +++ b/django/template/context.py @@ -37,7 +37,9 @@ class BaseContext: self.dicts.append(value) def __copy__(self): - duplicate = copy(super()) + duplicate = BaseContext() + duplicate.__class__ = self.__class__ + duplicate.__dict__ = copy(self.__dict__) duplicate.dicts = self.dicts[:] return duplicate diff --git a/tests/template_tests/test_context.py b/tests/template_tests/test_context.py index 6d8ee7a6e6..f71cf1ff25 100644 --- a/tests/template_tests/test_context.py +++ b/tests/template_tests/test_context.py @@ -1,3 +1,4 @@ +from copy import copy from unittest import mock from django.http import HttpRequest @@ -314,3 +315,10 @@ class RequestContextTests(SimpleTestCase): with self.assertRaisesMessage(TypeError, msg): with request_context.bind_template(Template("")): pass + + def test_context_copyable(self): + request_context = RequestContext(HttpRequest()) + request_context_copy = copy(request_context) + self.assertIsInstance(request_context_copy, RequestContext) + self.assertEqual(request_context_copy.dicts, request_context.dicts) + self.assertIsNot(request_context_copy.dicts, request_context.dicts)