summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBaptiste Mispelon <bmispelon@gmail.com>2014-02-22 22:28:27 +0100
committerBaptiste Mispelon <bmispelon@gmail.com>2014-02-22 23:33:48 +0100
commit7e1376c2b0ea9e02e61c1c764f02cd40c6f7e849 (patch)
tree982d36e199720e862edb1403239bf3be313715be
parent1d3ae4760b060f0df2965a2cfbee941bf8da6b31 (diff)
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.
-rw-r--r--django/template/loader.py3
-rw-r--r--tests/template_tests/templates/test_context_stack.html2
-rw-r--r--tests/template_tests/templatetags/custom.py5
-rw-r--r--tests/template_tests/test_loaders.py12
4 files changed, 21 insertions, 1 deletions
diff --git a/django/template/loader.py b/django/template/loader.py
index e9e2172e4b..036921f2f4 100644
--- a/django/template/loader.py
+++ b/django/template/loader.py
@@ -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
the templates in the list. Returns a string.
"""
- dictionary = dictionary or {}
if isinstance(template_name, (list, tuple)):
t = select_template(template_name, dirs)
else:
t = get_template(template_name, dirs)
if not context_instance:
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
# to keep the context_instance in the same state it started in.
with context_instance.push(dictionary):
diff --git a/tests/template_tests/templates/test_context_stack.html b/tests/template_tests/templates/test_context_stack.html
new file mode 100644
index 0000000000..c5097c5e66
--- /dev/null
+++ b/tests/template_tests/templates/test_context_stack.html
@@ -0,0 +1,2 @@
+{% load custom %}
+{% context_stack_length %}
diff --git a/tests/template_tests/templatetags/custom.py b/tests/template_tests/templatetags/custom.py
index 9aa51931e0..16e8e3e26a 100644
--- a/tests/template_tests/templatetags/custom.py
+++ b/tests/template_tests/templatetags/custom.py
@@ -22,6 +22,11 @@ def noop(value, param=None):
return value
+@register.simple_tag(takes_context=True)
+def context_stack_length(context):
+ return len(context.dicts)
+
+
@register.simple_tag
def no_params():
"""Expected no_params __doc__"""
diff --git a/tests/template_tests/test_loaders.py b/tests/template_tests/test_loaders.py
index 5f9306b33b..f89b9803e4 100644
--- a/tests/template_tests/test_loaders.py
+++ b/tests/template_tests/test_loaders.py
@@ -171,6 +171,18 @@ class RenderToStringTest(TestCase):
'No template names provided$',
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):