Fixed #21741 -- Fixed render_to_string to stop pushing empty dictionaries to its Context

Thanks to kezabelle for the report and original patch
and to numerodix for his improved patch.
This commit is contained in:
Baptiste Mispelon 2014-02-22 22:28:27 +01:00
parent 1d3ae4760b
commit 7e1376c2b0
4 changed files with 21 additions and 1 deletions

View File

@ -164,13 +164,14 @@ def render_to_string(template_name, dictionary=None, context_instance=None,
get_template, or it may be a tuple to use select_template to find one of get_template, or it may be a tuple to use select_template to find one of
the templates in the list. Returns a string. the templates in the list. Returns a string.
""" """
dictionary = dictionary or {}
if isinstance(template_name, (list, tuple)): if isinstance(template_name, (list, tuple)):
t = select_template(template_name, dirs) t = select_template(template_name, dirs)
else: else:
t = get_template(template_name, dirs) t = get_template(template_name, dirs)
if not context_instance: if not context_instance:
return t.render(Context(dictionary)) return t.render(Context(dictionary))
if not dictionary:
return t.render(context_instance)
# Add the dictionary to the context stack, ensuring it gets removed again # Add the dictionary to the context stack, ensuring it gets removed again
# to keep the context_instance in the same state it started in. # to keep the context_instance in the same state it started in.
with context_instance.push(dictionary): with context_instance.push(dictionary):

View File

@ -0,0 +1,2 @@
{% load custom %}
{% context_stack_length %}

View File

@ -22,6 +22,11 @@ def noop(value, param=None):
return value return value
@register.simple_tag(takes_context=True)
def context_stack_length(context):
return len(context.dicts)
@register.simple_tag @register.simple_tag
def no_params(): def no_params():
"""Expected no_params __doc__""" """Expected no_params __doc__"""

View File

@ -171,6 +171,18 @@ class RenderToStringTest(TestCase):
'No template names provided$', 'No template names provided$',
loader.select_template, []) loader.select_template, [])
def test_no_empty_dict_pushed_to_stack(self):
"""
No empty dict should be pushed to the context stack when render_to_string
is called without any argument (#21741).
"""
# The stack should have a length of 1, corresponding to the builtins
self.assertEqual('1',
loader.render_to_string('test_context_stack.html').strip())
self.assertEqual('1',
loader.render_to_string('test_context_stack.html', context_instance=Context()).strip())
class TemplateDirsOverrideTest(unittest.TestCase): class TemplateDirsOverrideTest(unittest.TestCase):