2010-08-10 4 views
2

J'écris une balise de modèle personnalisée 'firstnotnone', similaire à la balise template 'firstof' de Django. Comment utiliser des arguments de longueur variable? Le code ci-dessous aboutit à TemplateSyntaxError, firstnotnone prend 1 arguments.comment créer un tag de modèle personnalisé django avec une liste d'arguments de longueur variable

Modèle:

{% load library %} 
{% firstnotnone 'a' 'b' 'c' %} 

personnalisée bibliothèque de balises de modèle:

@register.simple_tag 
def firstnotnone(*args): 
    print args 
    for arg in args: 
     if arg is not None: 
      return arg 

Répondre

2

templatetags personnalisés:

from django.template import Library, Node, TemplateSyntaxError 
from django.utils.encoding import smart_unicode 

register = Library() 

class FirstNotNoneNode(Node): 
    def __init__(self, vars): 
     self.vars = vars 

    def render(self, context): 
     for var in self.vars: 
      value = var.resolve(context, True) 
      if value is not None: 
       return smart_unicode(value) 
     return u'' 

def firstnotnone(parser,token): 
    """ 
    Outputs the first variable passed that is not None 
    """ 
    bits = token.split_contents()[1:] 
    if len(bits) < 1: 
     raise TemplateSyntaxError("'firstnotnone' statement requires at least one argument") 
    return FirstNotNoneNode([parser.compile_filter(bit) for bit in bits]) 

firstnotnone = register.tag(firstnotnone) 
+1

Merci, le code semble propre. Dommage que cela ne puisse pas être fait avec une liste d'arguments de longueur variable. –

+0

Vous êtes sûr que ça ne peut pas? – MattH

+0

@Jack Ha: Il gère les listes d'arguments de longueur variable, je l'ai même testé. Pour autant que je puisse voir, c'est une mise en œuvre exactement de ce que vous demandiez. – MattH

4

La balise firstof n'est pas mis en œuvre par le simple_tag décorateur - il utilise la forme longue d'une sous-classe template.Node et une étiquette séparée fonction. Vous pouvez voir le code dans django.template.defaulttags - il devrait être assez simple de changer pour vos fins.

Questions connexes