diff --git a/django/template/loader.py b/django/template/loader.py index 279d8e86fe..e58dc3231d 100644 --- a/django/template/loader.py +++ b/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." diff --git a/tests/regressiontests/templates/loaders.py b/tests/regressiontests/templates/loaders.py index f0759ec2c6..6c74033944 100644 --- a/tests/regressiontests/templates/loaders.py +++ b/tests/regressiontests/templates/loaders.py @@ -148,5 +148,30 @@ class CachedLoader(unittest.TestCase): # 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() diff --git a/tests/regressiontests/templates/templates/test_context.html b/tests/regressiontests/templates/templates/test_context.html new file mode 100644 index 0000000000..a100f03de6 --- /dev/null +++ b/tests/regressiontests/templates/templates/test_context.html @@ -0,0 +1 @@ +obj:{{ obj }} \ No newline at end of file