From b748a8bc670af10c37560836c353ce911eaeecc0 Mon Sep 17 00:00:00 2001 From: Luke Plant Date: Mon, 10 Nov 2014 14:43:40 +0000 Subject: [PATCH] Fixed #23789 -- TemplateResponse handles context differently from render --- django/template/response.py | 5 ++++- docs/ref/template-response.txt | 7 ++++--- docs/releases/1.8.txt | 14 ++++++++++++++ tests/template_tests/test_response.py | 6 ++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/django/template/response.py b/django/template/response.py index f65c3adb8b..f43a4e0f53 100644 --- a/django/template/response.py +++ b/django/template/response.py @@ -154,4 +154,7 @@ class TemplateResponse(SimpleTemplateResponse): """ if isinstance(context, Context): return context - return RequestContext(self._request, context, current_app=self._current_app) + context_instance = RequestContext(self._request, current_app=self._current_app) + if context: + context_instance.push(context) + return context_instance diff --git a/docs/ref/template-response.txt b/docs/ref/template-response.txt index 7f0ddcf58d..bfee0e29af 100644 --- a/docs/ref/template-response.txt +++ b/docs/ref/template-response.txt @@ -287,9 +287,10 @@ invoked immediately. Using TemplateResponse and SimpleTemplateResponse ================================================= -A TemplateResponse object can be used anywhere that a normal -HttpResponse can be used. It can also be used as an alternative to -calling :func:`~django.shortcuts.render_to_response()`. +A TemplateResponse object can be used anywhere that a normal HttpResponse can be +used. It can also be used as an alternative to calling +:func:`~django.shortcuts.render()` or +:func:`~django.shortcuts.render_to_response()`. For example, the following simple view returns a :class:`TemplateResponse()` with a simple template, and a context diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt index 4334408db7..dda798f0a2 100644 --- a/docs/releases/1.8.txt +++ b/docs/releases/1.8.txt @@ -640,6 +640,20 @@ run this query:: the serialization framework, that means that ``dumpdata`` output will now contain the SRID value of geometry objects. +Priority of context processors for ``TemplateResponse`` brought in line with ``render`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The :class:`~django.template.response.TemplateResponse` constructor is designed to be a +drop-in replacement for the :func:`~django.shortcuts.render` function. However, +it had a slight incompatibility, in that for ``TemplateResponse``, context data +from the passed in context dictionary could be shadowed by context data returned +from context processors, whereas for ``render`` it was the other way +around. This was a bug, and the behaviour of ``render`` is more appropriate, +since it allows the globally defined context processors to be overridden locally +in the view. If you were relying on the fact context data in a +``TemplateResponse`` could be overridden using a context processor, you will +need to change your code. + Miscellaneous ~~~~~~~~~~~~~ diff --git a/tests/template_tests/test_response.py b/tests/template_tests/test_response.py index 8791a11353..d7dd3f4d31 100644 --- a/tests/template_tests/test_response.py +++ b/tests/template_tests/test_response.py @@ -233,6 +233,12 @@ class TemplateResponseTest(TestCase): Context({'foo': 'bar'})).render() self.assertEqual(response.content, b'bar') + def test_context_processor_priority(self): + # context processors should be overridden by passed-in context + response = self._response('{{ foo }}{{ processors }}', + {'processors': 'no'}).render() + self.assertEqual(response.content, b'no') + def test_kwargs(self): response = self._response(content_type='application/json', status=504)