|
@@ -8,6 +8,7 @@ import jinja2
|
|
|
from django.conf import settings
|
|
|
from django.template import TemplateDoesNotExist, TemplateSyntaxError
|
|
|
from django.utils import six
|
|
|
+from django.utils.functional import cached_property
|
|
|
from django.utils.module_loading import import_string
|
|
|
|
|
|
from .base import BaseEngine
|
|
@@ -23,6 +24,8 @@ class Jinja2(BaseEngine):
|
|
|
options = params.pop('OPTIONS').copy()
|
|
|
super(Jinja2, self).__init__(params)
|
|
|
|
|
|
+ self.context_processors = options.pop('context_processors', [])
|
|
|
+
|
|
|
environment = options.pop('environment', 'jinja2.Environment')
|
|
|
environment_cls = import_string(environment)
|
|
|
|
|
@@ -36,11 +39,11 @@ class Jinja2(BaseEngine):
|
|
|
self.env = environment_cls(**options)
|
|
|
|
|
|
def from_string(self, template_code):
|
|
|
- return Template(self.env.from_string(template_code))
|
|
|
+ return Template(self.env.from_string(template_code), self)
|
|
|
|
|
|
def get_template(self, template_name):
|
|
|
try:
|
|
|
- return Template(self.env.get_template(template_name))
|
|
|
+ return Template(self.env.get_template(template_name), self)
|
|
|
except jinja2.TemplateNotFound as exc:
|
|
|
six.reraise(
|
|
|
TemplateDoesNotExist,
|
|
@@ -52,11 +55,16 @@ class Jinja2(BaseEngine):
|
|
|
new.template_debug = get_exception_info(exc)
|
|
|
six.reraise(TemplateSyntaxError, new, sys.exc_info()[2])
|
|
|
|
|
|
+ @cached_property
|
|
|
+ def template_context_processors(self):
|
|
|
+ return [import_string(path) for path in self.context_processors]
|
|
|
+
|
|
|
|
|
|
class Template(object):
|
|
|
|
|
|
- def __init__(self, template):
|
|
|
+ def __init__(self, template, backend):
|
|
|
self.template = template
|
|
|
+ self.backend = backend
|
|
|
self.origin = Origin(
|
|
|
name=template.filename, template_name=template.name,
|
|
|
)
|
|
@@ -68,6 +76,8 @@ class Template(object):
|
|
|
context['request'] = request
|
|
|
context['csrf_input'] = csrf_input_lazy(request)
|
|
|
context['csrf_token'] = csrf_token_lazy(request)
|
|
|
+ for context_processor in self.backend.template_context_processors:
|
|
|
+ context.update(context_processor(request))
|
|
|
return self.template.render(context)
|
|
|
|
|
|
|