diff --git a/django/template/backends/django.py b/django/template/backends/django.py index 580d789a67fb3..63747f7c7fef8 100644 --- a/django/template/backends/django.py +++ b/django/template/backends/django.py @@ -45,5 +45,11 @@ def render(self, context=None, request=None): if request is None: context = Context(context) else: - context = RequestContext(request, context) + # The following pattern is required to ensure values from + # context override those from template context processors. + original_context = context + context = RequestContext(request) + if original_context: + context.push(original_context) + return self.template.render(context) diff --git a/tests/template_backends/test_django.py b/tests/template_backends/test_django.py index 5c5070cb18878..f332abbf24163 100644 --- a/tests/template_backends/test_django.py +++ b/tests/template_backends/test_django.py @@ -1,4 +1,7 @@ from django.template.backends.django import DjangoTemplates +from django.test import RequestFactory + +from template_tests.test_response import test_processor_name from .test_dummy import TemplateStringsTests @@ -7,3 +10,25 @@ class DjangoTemplatesTests(TemplateStringsTests): engine_class = DjangoTemplates backend_name = 'django' + + def test_context_has_priority_over_template_context_processors(self): + # See ticket #23789. + engine = DjangoTemplates({ + 'DIRS': [], + 'APP_DIRS': False, + 'NAME': 'django', + 'OPTIONS': { + 'context_processors': [test_processor_name], + }, + }) + + template = engine.from_string('{{ processors }}') + request = RequestFactory().get('/') + + # Check that context processors run + content = template.render({}, request) + self.assertEqual(content, 'yes') + + # Check that context overrides context processors + content = template.render({'processors': 'no'}, request) + self.assertEqual(content, 'no')