diff --git a/django/template/context.py b/django/template/context.py index 9982b85f6d..b2f00abd31 100644 --- a/django/template/context.py +++ b/django/template/context.py @@ -102,7 +102,15 @@ class BaseContext(object): Compares two contexts by comparing theirs 'dicts' attributes. """ if isinstance(other, BaseContext): - return self.dicts[-1] == other.dicts[-1] + # because dictionaries can be put in different order + # we have to flatten them like in templates + def flatten(dicts): + flat = {} + for d in dicts: + flat.update(d) + return flat + + return flatten(self.dicts) == flatten(other.dicts) # if it's not comparable return false return False diff --git a/tests/template_tests/test_context.py b/tests/template_tests/test_context.py index f810feda74..64d0df8d10 100644 --- a/tests/template_tests/test_context.py +++ b/tests/template_tests/test_context.py @@ -53,4 +53,22 @@ class ContextTests(TestCase): def test_context_comparable(self): test_data = {'x': 'y', 'v': 'z', 'd': {'o': object, 'a': 'b'}} - self.assertEquals(Context(test_data), Context(test_data)) + self.assertEqual(Context(test_data), Context(test_data)) + + # Regression test for #21765 + a = Context() + b = Context() + self.assertEqual(a, b) + + # update only a + a.update({'a': 1}) + self.assertNotEqual(a, b) + + # update both to check regression + a.update({'c': 3}) + b.update({'c': 3}) + self.assertNotEqual(a, b) + + # make contexts equals again + b.update({'a': 1}) + self.assertEqual(a, b)