Fixed #21639 -- Implemented RenderContext.__getitem__

It's now consistent with RenderContext.get.
This commit is contained in:
Alex Hill 2013-12-19 13:42:32 +08:00 committed by Baptiste Mispelon
parent 23d9f517dc
commit 832ab0dbaa
2 changed files with 18 additions and 4 deletions

View File

@ -145,11 +145,10 @@ class RenderContext(BaseContext):
return key in self.dicts[-1] return key in self.dicts[-1]
def get(self, key, otherwise=None): def get(self, key, otherwise=None):
d = self.dicts[-1] return self.dicts[-1].get(key, otherwise)
if key in d:
return d[key]
return otherwise
def __getitem__(self, key):
return self.dicts[-1][key]
# This is a function rather than module-level procedural code because we only # This is a function rather than module-level procedural code because we only
# want it to execute if somebody uses RequestContext. # want it to execute if somebody uses RequestContext.

View File

@ -3,6 +3,7 @@
from unittest import TestCase from unittest import TestCase
from django.template import Context, Variable, VariableDoesNotExist from django.template import Context, Variable, VariableDoesNotExist
from django.template.context import RenderContext
class ContextTests(TestCase): class ContextTests(TestCase):
@ -34,3 +35,17 @@ class ContextTests(TestCase):
self.assertRaises(VariableDoesNotExist, self.assertRaises(VariableDoesNotExist,
Variable('new').resolve, empty_context) Variable('new').resolve, empty_context)
self.assertEqual(Variable('new').resolve(Context({'new': 'foo'})), 'foo') self.assertEqual(Variable('new').resolve(Context({'new': 'foo'})), 'foo')
def test_render_context(self):
test_context = RenderContext({'fruit': 'papaya'})
# Test that push() limits access to the topmost dict
test_context.push()
test_context['vegetable'] = 'artichoke'
self.assertEqual(list(test_context), ['vegetable'])
self.assertNotIn('fruit', test_context)
with self.assertRaises(KeyError):
test_context['fruit']
self.assertIsNone(test_context.get('fruit'))