Commit 1073a83f authored by Chris Beaven's avatar Chris Beaven
Browse files

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
parent 8ee9a462
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -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:
    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)
    else:
        context_instance = Context(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."
+25 −0
Original line number Diff line number Diff line
@@ -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()
+1 −0
Original line number Diff line number Diff line
obj:{{ obj }}
 No newline at end of file