from django import template register = template.Library() class RenderPartialNode(template.Node): def __init__(self, object_name, template_name=None): self.object_name = object_name self.template_name = template_name def render(self, context): if not self.template_name: self.template_name = 'partials/' + context[self.object_name].__class__.__name__.lower() + '.html' t = template.loader.get_template(self.template_name) return t.render(context) def do_render_partial(parser, token): bits = token.split_contents() if len(bits) == 2: return RenderPartialNode(bits[1]) elif len(bits) == 3: return RenderPartialNode(bits[1], bits[2]) else: raise template.TemplateSyntaxError, "%r requires one or two arguments" % bits[0] register.tag('render_partial', do_render_partial)