如何使用可变长度arg列表制作django自定义模板标签

时间:2010-08-10 13:11:47

标签: python django django-templates

我正在编写一个自定义模板标签'firstnotnone',类似于Django的'firstof'模板标签。如何使用变长参数?下面的代码导致TemplateSyntaxError,firstnotnone需要1个参数。

模板:

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

自定义模板标记库:

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

2 个答案:

答案 0 :(得分:4)

firstof标记未通过simple_tag装饰器实现 - 它使用长template.Node子类和单独的标记函数。您可以在django.template.defaulttags中看到代码 - 根据您的目的进行更改应该相当简单。

答案 1 :(得分:2)

自定义模板标签:

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)