Ensure render_to_string leaves the context instance stack in the state it was originally passed in.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15591 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Chris Beaven 2011-02-20 04:55:11 +00:00
parent 8ee9a4627e
commit 1073a83f2c
3 changed files with 35 additions and 5 deletions

View File

@ -179,11 +179,15 @@ def render_to_string(template_name, dictionary=None, context_instance=None):
t = select_template(template_name) t = select_template(template_name)
else: else:
t = get_template(template_name) t = get_template(template_name)
if context_instance: if not context_instance:
context_instance.update(dictionary) return t.render(Context(dictionary))
else: # Add the dictionary to the context stack, ensuring it gets removed again
context_instance = Context(dictionary) # to keep the context_instance in the same state it started in.
return t.render(context_instance) context_instance.update(dictionary)
try:
return t.render(context_instance)
finally:
context_instance.pop()
def select_template(template_name_list): def select_template(template_name_list):
"Given a list of template names, returns the first that can be loaded." "Given a list of template names, returns the first that can be loaded."

View File

@ -148,5 +148,30 @@ class CachedLoader(unittest.TestCase):
# The two templates should not have the same content # The two templates should not have the same content
self.assertNotEqual(t1.render(Context({})), t2.render(Context({}))) self.assertNotEqual(t1.render(Context({})), t2.render(Context({})))
class RenderToStringTest(unittest.TestCase):
def setUp(self):
self._old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates'),
)
def tearDown(self):
settings.TEMPLATE_DIRS = self._old_TEMPLATE_DIRS
def test_basic(self):
self.assertEqual(loader.render_to_string('test_context.html'), 'obj:')
def test_basic_context(self):
self.assertEqual(loader.render_to_string('test_context.html',
{'obj': 'test'}), 'obj:test')
def test_existing_context_kept_clean(self):
context = Context({'obj': 'before'})
output = loader.render_to_string('test_context.html', {'obj': 'after'},
context_instance=context)
self.assertEqual(output, 'obj:after')
self.assertEqual(context['obj'], 'before')
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -0,0 +1 @@
obj:{{ obj }}