2
0

renderers.py 2.0 KB

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