как сделать пользовательский шаблонный тег django со списком аргументов переменной длины - PullRequest
2 голосов
/ 10 августа 2010

Я пишу пользовательский тег шаблона 'firstnotnone', похожий на шаблонный тег 'firstof' в Django.Как использовать аргументы переменной длины?Приведенный ниже код приводит к 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 ]

4 голосов
/ 10 августа 2010

Тег firstof не реализован через декоратор simple_tag - он использует длинную форму подкласса template.Node и отдельную функцию тега. Вы можете увидеть код в django.template.defaulttags - это должно быть довольно просто изменить для ваших целей.

2 голосов
/ 10 августа 2010

Пользовательские теги:

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