OLD | NEW |
(Empty) | |
| 1 import os |
| 2 |
| 3 from django.conf import settings |
| 4 from django.template.backends.django import DjangoTemplates |
| 5 from django.template.loader import get_template |
| 6 from django.utils import lru_cache |
| 7 from django.utils._os import upath |
| 8 from django.utils.functional import cached_property |
| 9 from django.utils.module_loading import import_string |
| 10 |
| 11 try: |
| 12 from django.template.backends.jinja2 import Jinja2 |
| 13 except ImportError: |
| 14 def Jinja2(params): |
| 15 raise ImportError("jinja2 isn't installed") |
| 16 |
| 17 ROOT = upath(os.path.dirname(__file__)) |
| 18 |
| 19 |
| 20 @lru_cache.lru_cache() |
| 21 def get_default_renderer(): |
| 22 renderer_class = import_string(settings.FORM_RENDERER) |
| 23 return renderer_class() |
| 24 |
| 25 |
| 26 class BaseRenderer(object): |
| 27 def get_template(self, template_name): |
| 28 raise NotImplementedError('subclasses must implement get_template()') |
| 29 |
| 30 def render(self, template_name, context, request=None): |
| 31 template = self.get_template(template_name) |
| 32 return template.render(context, request=request).strip() |
| 33 |
| 34 |
| 35 class EngineMixin(object): |
| 36 def get_template(self, template_name): |
| 37 return self.engine.get_template(template_name) |
| 38 |
| 39 @cached_property |
| 40 def engine(self): |
| 41 return self.backend({ |
| 42 'APP_DIRS': True, |
| 43 'DIRS': [os.path.join(ROOT, self.backend.app_dirname)], |
| 44 'NAME': 'djangoforms', |
| 45 'OPTIONS': {}, |
| 46 }) |
| 47 |
| 48 |
| 49 class DjangoTemplates(EngineMixin, BaseRenderer): |
| 50 """ |
| 51 Load Django templates from the built-in widget templates in |
| 52 django/forms/templates and from apps' 'templates' directory. |
| 53 """ |
| 54 backend = DjangoTemplates |
| 55 |
| 56 |
| 57 class Jinja2(EngineMixin, BaseRenderer): |
| 58 """ |
| 59 Load Jinja2 templates from the built-in widget templates in |
| 60 django/forms/jinja2 and from apps' 'jinja2' directory. |
| 61 """ |
| 62 backend = Jinja2 |
| 63 |
| 64 |
| 65 class TemplatesSetting(BaseRenderer): |
| 66 """ |
| 67 Load templates using template.loader.get_template() which is configured |
| 68 based on settings.TEMPLATES. |
| 69 """ |
| 70 def get_template(self, template_name): |
| 71 return get_template(template_name) |
OLD | NEW |