"""@see http://www.b-list.org/weblog/2006/06/07/django-tips-write-better-template-tags """ from django.template import Library, Node from django.db.models import get_model register = Library() class LatestContentNode(Node): def __init__(self, model, num, varname): self.num, self.varname = num, varname self.model = get_model(*model.split('.')) def render(self, context): context[self.varname] = self.model._default_manager.all()[:self.num] return'' def get_latest(parser, token): """ {% get_latest weblog.Link 5 as recent_links %} {% get_latest weblog.Entry 10 as latest_entries %} {% get_latest comments.Comment 5 as recent_comments %} """ bits = token.contents.split() if len(bits) != 5: raise TemplateSyntaxError, "get_latest tag takes exactly three arguments" if bits[3] != 'as': raise TemplateSyntaxError, "third argument to get_latest tag must be 'as'" return LatestContentNode(bits[1], bits[2], bits[4]) get_latest = register.tag(get_latest)