Skip to content

Commit

Permalink
Made context take priority over context processors.
Browse files Browse the repository at this point in the history
This is the expected behavior, but given RequestContext's tortuous
implementation, a straightforward use of its API results in the
opposite.

This commits fixes a regression that must have happened at different
points in the multiple templates engine refactor for different features.
  • Loading branch information
aaugustin committed Jan 6, 2015
1 parent ed220c4 commit 0cdb09d
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
8 changes: 7 additions & 1 deletion django/template/backends/django.py
Expand Up @@ -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)
25 changes: 25 additions & 0 deletions 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

Expand All @@ -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')

0 comments on commit 0cdb09d

Please sign in to comment.