diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 6c7cdf537..c2e761f09 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -200,6 +200,42 @@ class TemplateHTMLRenderer(BaseRenderer): response.status_text.title())) +class JinjaTemplateRenderer(TemplateHTMLRenderer): + """ + Renders data to HTML for use with the Jinja2 template engine. + + The template name is determined by (in order of preference): + + 1. An explicit .template_name set on the response. + 2. An explicit .template_name set on this class. + 3. The return result of calling view.get_template_names(). + """ + + def render(self, data, accepted_media_type=None, renderer_context=None): + + renderer_context = renderer_context or {} + view = renderer_context['view'] + request = renderer_context['request'] + response = renderer_context['response'] + + # add the current user to the context + # otherwise it won't be available in templates + renderer_context['user'] = request.user + + # get template (jinja2) + if response.exception: + template = self.get_exception_template(response) + else: + template_names = self.get_template_names(response, view) + template = self.resolve_template(template_names) + + # return the dict containing the context + # for jinja2 to process. + # Would throw a value error if a + # RequestContext was returned + return template.render(renderer_context) + + # Note, subclass TemplateHTMLRenderer simply for the exception behavior class StaticHTMLRenderer(TemplateHTMLRenderer): """