|
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) |