from os.path import dirname, join, abspath, isdir
from django.db.models import get_app
from django.core.exceptions import ImproperlyConfigured
from django.template import TemplateDoesNotExist
from django.template.loaders.filesystem import load_template_source
def _get_template_vars(template_name):
app_name, template_name = template_name.split(":", 1)
try:
template_dir = abspath(join(dirname(get_app(app_name).__file__), 'templates'))
except ImproperlyConfigured:
raise TemplateDoesNotExist()
return template_name, template_dir
def load_template_from_app(template_name, template_dirs=None):
"""
Template loader that only serves templates from specific app's template directory.
Works for template_names in format app_label:some/template/name.html
"""
if ":" not in template_name:
raise TemplateDoesNotExist()
template_name, template_dir = _get_template_vars(template_name)
if not isdir(template_dir):
raise TemplateDoesNotExist()
return load_template_source(template_name, template_dirs=[template_dir])
load_template_from_app.is_usable = True
Comments
I put an updated version of this code on bitbucket: http://bitbucket.org/wojas/django-apptemplates
My version is compatible with newer Django releases, works with apps that do not have any models, and is installable as a Python package.
#