首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何制作可变长度arg列表的django自定义模板标签

问如何制作可变长度arg列表的django自定义模板标签
EN

Stack Overflow用户
提问于 2010-08-10 21:11:47
回答 2查看 1.1K关注 0票数 2

我正在编写一个自定义的模板标签'firstnotnone',类似于Django的'firstof‘模板标签。如何使用可变长度参数?下面的代码结果是TemplateSyntaxError,firstnotnone接受1个参数。

模板:

代码语言:javascript
复制
{% load library %}
{% firstnotnone 'a' 'b' 'c' %}

自定义模板标签库:

代码语言:javascript
复制
@register.simple_tag
def firstnotnone(*args):
    print args
    for arg in args:
        if arg is not None:
            return arg
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-10 21:29:22

自定义模板标签:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2010-08-10 21:21:37

firstof标记不是通过simple_tag装饰器实现的-它使用template.Node子类和单独标记函数的长形式。你可以在django.template.defaulttags中看到代码--为了你的目的修改它应该是相当简单的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3449265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档