如何在jinja2中使用函数

0 投票
1 回答
737 浏览
提问于 2025-04-18 05:44

在一个.py文件里,我有一个函数,它可以根据一个压缩文件(zip文件)创建一个树形结构,里面包含一些信息,比如名字、类型、大小等等。(我想要把这个压缩文件的内容以树形视图展示出来。)还有另一个函数,它会生成一些HTML标签,比如<ul><li>,用来显示这些组件的名字,如果有子项的话,就会嵌套显示。这个函数不返回任何值。

我想要的是在jinja模板里有一个区域,可以显示上面那个函数生成的HTML代码。

这个函数是:

def print_tree(tree):
    print "<ul>"
    for t in tree:
        print "<li>" + t['name']
        if 'children' in t:
            print_tree(t['children'])
        print "</li>"
    print "</ul>"

我该怎么做呢?

1 个回答

3

让你的函数 返回 一个字符串,而不是直接打印出来:

def print_tree(tree):
    result = ['<ul>']
    for t in tree:
        result.append("<li>" + t['name'])
        if 'children' in t:
            result.append(print_tree(t['children']))
        result.append("</li>")
    result.append("</ul>")
    return '\n'.join(result)

你可以直接在 Jinja 中做到这一点,而不需要用到函数:

<ul>
{%- for t in tree recursive %}
    <li>{{ t.name }}
    {%- if t.children -%}
        <ul>{{ loop(t.children) }}</ul>
    {%- endif %}</li>
{%- endfor %}
</ul>

在这里,loop() 的调用会重复使用标记为 recursivefor 循环,产生一个递归的树形结构,和 print_tree() 函数的效果是一样的。

撰写回答