from django import template from django.conf import settings import pystache import os register = template.Library() class View(pystache.View): template_path = settings.TEMPLATE_DIRS[0] def __init__(self, template_dir, template_name, context): self.template_path = template_dir self.template_name = template_name return super(View, self).__init__(context=context) class MustacheNode(template.Node): def __init__(self, template_name, attr=None): for template_dir in settings.TEMPLATE_DIRS: if os.path.exists(os.path.join(template_dir, template_name) + ".mustache"): break else: raise IOError("failed to find %s in %s" % (template_name, str(settings.TEMPLATE_DIRS))) self.template_path = template_dir self.template = template_name self.attr = attr def render(self, context): mcontext = context[self.attr] if self.attr else {} view = View(self.template_path, self.template, context=mcontext) return view.render() def do_mustache(parser, token): """ Loads a mustache template and render it inline Example:: {% mustache "foo/bar" data %} """ bits = token.split_contents() if len(bits) not in [2,3]: raise template.TemplateSyntaxError("%r tag takes two arguments: the location of the template file, and the template context" % bits[0]) path = bits[1] path = path[1:-1] attrs = bits[2:] return MustacheNode(path, *attrs) register.tag("mustache", do_mustache)