Skip to content

Instantly share code, notes, and snippets.

@carljm
Created June 14, 2015 21:21
Show Gist options
  • Save carljm/9d54151291fd83f4b46c to your computer and use it in GitHub Desktop.
Save carljm/9d54151291fd83f4b46c to your computer and use it in GitHub Desktop.
Django Jinja2 backend subclass with context processor support
class Jinja2Backend(jinja2backend.Jinja2):
def __init__(self, params):
self.context_processors = [
import_string(p)
for p in params['OPTIONS'].pop('context_processors', [])
]
super(Jinja2Backend, self).__init__(params)
def from_string(self, template_code):
return Template(
self.env.from_string(template_code), self.context_processors)
def get_template(self, template_name):
try:
return Template(
self.env.get_template(template_name), self.context_processors)
except jinja2.TemplateNotFound as exc:
six.reraise(TemplateDoesNotExist, TemplateDoesNotExist(exc.args),
sys.exc_info()[2])
except jinja2.TemplateSyntaxError as exc:
six.reraise(TemplateSyntaxError, TemplateSyntaxError(exc.args),
sys.exc_info()[2])
class Template(jinja2backend.Template):
def __init__(self, template, context_processors):
self.template = template
self.context_processors = context_processors
def render(self, context=None, request=None):
if context is None:
context = {}
if request is not None:
context['request'] = request
lazy_csrf_input = csrf_input_lazy(request)
context['csrf'] = lambda: lazy_csrf_input
context['csrf_input'] = lazy_csrf_input
context['csrf_token'] = csrf_token_lazy(request)
for cp in self.context_processors:
context.update(cp(request))
return self.template.render(context)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment