from django.template import Library, Node, NodeList, TemplateSyntaxError, Variable from django.utils.translation import ugettext as _ register = Library() class IfInListNode( Node ): """ Implements the actual logic of the ifinlist tag. """ def __init__( self, value_var, list_var, nodelist_true, nodelist_false ): self.value_var, self.list_var = Variable( value_var ), Variable( list_var ) self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false def __repr__( self ): return "" def render( self, context ): try: value_var = self.value_var.resolve( context ) except VariableDoesNotExist: list_var = None try: list_var = self.list_var.resolve( context ) except VariableDoesNotExist: list_var = None if not isinstance( list_var, list ): raise if value_var in list_var: return self.nodelist_true.render(context) return self.nodelist_false.render(context) def do_ifinlist( parser, token ): """ Checks if a value is in a list. Sample usage: Suppose that we have the following value and list variables passed to the template: letter = 'C' letters = [ 'A', 'B', 'C', 'D' ] {% ifinlist letter letters %} Yes {% else %} No {% endifinlist %} """ bits = token.contents.split() len_bits = len( bits ) if len_bits != 3: raise TemplateSyntaxError( _( '%s tag requires three arguments' ) % bits[ 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 = NodeList() return IfInListNode( bits[ 1 ], bits[ 2 ], nodelist_true, nodelist_false ) do_ifinlist = register.tag( 'ifinlist', do_ifinlist )