Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Ensure render_to_string leaves the context instance stack in the stat…

…e it was originally passed in.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15591 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 1073a83f2ceb330c80da275c0709786a7a84c513 1 parent 8ee9a46
@SmileyChris SmileyChris authored
View
14 django/template/loader.py
@@ -179,11 +179,15 @@ def render_to_string(template_name, dictionary=None, context_instance=None):
t = select_template(template_name)
else:
t = get_template(template_name)
- if context_instance:
- context_instance.update(dictionary)
- else:
- context_instance = Context(dictionary)
- return t.render(context_instance)
+ if not context_instance:
+ return t.render(Context(dictionary))
+ # Add the dictionary to the context stack, ensuring it gets removed again
+ # to keep the context_instance in the same state it started in.
+ context_instance.update(dictionary)
+ try:
+ return t.render(context_instance)
+ finally:
+ context_instance.pop()
def select_template(template_name_list):
"Given a list of template names, returns the first that can be loaded."
View
25 tests/regressiontests/templates/loaders.py
@@ -148,5 +148,30 @@ def test_templatedir_caching(self):
# The two templates should not have the same content
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__":
unittest.main()
View
1  tests/regressiontests/templates/templates/test_context.html
@@ -0,0 +1 @@
+obj:{{ obj }}
Please sign in to comment.
Something went wrong with that request. Please try again.