Răsfoiți Sursa

Fixed #21765 -- Added support for comparing Context instances

Marek Wywiał 11 ani în urmă
părinte
comite
d97bf2e9c8

+ 10 - 0
django/template/context.py

@@ -97,6 +97,16 @@ class BaseContext(object):
         new_context._reset_dicts(values)
         return new_context
 
+    def __eq__(self, other):
+        """
+        Compares two contexts by comparing theirs 'dicts' attributes.
+        """
+        if isinstance(other, BaseContext):
+            return self.dicts[-1] == other.dicts[-1]
+
+        # if it's not comparable return false
+        return False
+
 
 class Context(BaseContext):
     "A stack container for variable context"

+ 5 - 0
tests/template_tests/test_context.py

@@ -49,3 +49,8 @@ class ContextTests(TestCase):
         with self.assertRaises(KeyError):
             test_context['fruit']
         self.assertIsNone(test_context.get('fruit'))
+
+    def test_context_comparable(self):
+        test_data = {'x': 'y', 'v': 'z', 'd': {'o': object, 'a': 'b'}}
+
+        self.assertEquals(Context(test_data), Context(test_data))

+ 13 - 0
tests/template_tests/tests.py

@@ -1928,6 +1928,19 @@ class RequestContextTests(unittest.TestCase):
         # [builtins, supplied context, context processor]
         self.assertEqual(len(ctx.dicts), 3)
 
+    @override_settings(TEMPLATE_CONTEXT_PROCESSORS=())
+    def test_context_comparable(self):
+        test_data = {'x': 'y', 'v': 'z', 'd': {'o': object, 'a': 'b'}}
+
+        # test comparing RequestContext to prevent problems if somebody
+        # adds __eq__ in the future
+        request = RequestFactory().get('/')
+
+        self.assertEquals(
+            RequestContext(request, dict_=test_data),
+            RequestContext(request, dict_=test_data)
+        )
+
 
 class SSITests(TestCase):
     def setUp(self):