Selaa lähdekoodia

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__().
Mariusz Felisiak 4 kuukautta sitten
vanhempi
commit
8d7b1423f8
2 muutettua tiedostoa jossa 11 lisäystä ja 1 poistoa
  1. 3 1
      django/template/context.py
  2. 8 0
      tests/template_tests/test_context.py

+ 3 - 1
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
 

+ 8 - 0
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)