Skip to content

Instantly share code, notes, and snippets.

@digitaldreamer
Created November 17, 2009 05:14
Show Gist options
  • Save digitaldreamer/236664 to your computer and use it in GitHub Desktop.
Save digitaldreamer/236664 to your computer and use it in GitHub Desktop.
django template tags
from django import template
register = template.Library()
# ifinlist
class IfInListNode(template.Node):
def __init__(self, nodelist_true, nodelist_false, item, list):
self.nodelist_true = nodelist_true
self.nodelist_false = nodelist_false
self.item = template.Variable(item)
self.list = template.Variable(list)
def render(self, context):
try:
item = self.item.resolve(context)
list = self.list.resolve(context)
except template.VariableDoesNotExist:
return ''
try:
if item in list:
return self.nodelist_true.render(context)
else:
return self.nodelist_false.render(context)
except TypeError:
return ''
@register.tag
def ifinlist(parser, token):
try:
tag_name, item, list = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError, "%r tag requires two arguments" % token.contents.split()[0]
nodelist_true = parser.parse(('else', 'endifinlist'))
token = parser.next_token()
if token.contents == 'else':
nodelist_false = parser.parse(('endifinlist',))
parser.delete_first_token()
else:
nodelist_false = template.NodeList()
return IfInListNode(nodelist_true, nodelist_false, item, list)
# ifnotinlist
class IfNotInListNode(template.Node):
def __init__(self, nodelist_true, nodelist_false, item, list):
self.nodelist_true = nodelist_true
self.nodelist_false = nodelist_false
self.item = template.Variable(item)
self.list = template.Variable(list)
def render(self, context):
try:
item = self.item.resolve(context)
list = self.list.resolve(context)
except template.VariableDoesNotExist:
return ''
try:
if item not in list:
return self.nodelist_true.render(context)
else:
return self.nodelist_false.render(context)
except TypeError:
return ''
@register.tag
def ifnotinlist(parser, token):
try:
tag_name, item, list = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError, "%r tag requires two arguments" % token.contents.split()[0]
nodelist_true = parser.parse(('else', 'endifnotinlist'))
token = parser.next_token()
if token.contents == 'else':
nodelist_false = parser.parse(('endifnotinlist',))
parser.delete_first_token()
else:
nodelist_false = template.NodeList()
return IfNotInListNode(nodelist_true, nodelist_false, item, list)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment