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:
parent
8ee9a4627e
commit
1073a83f2c
|
@ -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."
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
obj:{{ obj }}
|
Loading…
Reference in New Issue