如果在jinja2中分支

时间:2012-06-30 05:19:07

标签: python wsgi jinja2

我们可以在jinja2中使用哪种条件进行分支?我的意思是我们可以使用python之类的语句。例如,我想检查标题的长度。如果大于60个字符,我想将它限制为60个字符,然后输入“......”现在,我正在做这样的事情,但它不起作用。 error.log报告len函数未定义。

template = Template('''
    <!DOCTYPE html>
            <head>
                    <title>search results</title>
                    <link rel="stylesheet" href="static/results.css">
            </head>
            <body>
                    {% for item in items %}
                            {% if len(item[0]) < 60 %}
                                    <p><a href="{{ item[1] }}">{{item[0]}}</a></p>
                            {% else %}
                                    <p><a href="{{ item[1] }}">{{item[0][40:]}}...</a></p>
                            {% endif %}
                    {% endfor %}
            </body>
    </html>''')

## somewhere later in the code...

template.render(items=links).encode('utf-8')

3 个答案:

答案 0 :(得分:12)

你非常接近,你只需要将它移到你的Python脚本中。所以你可以定义一个这样的谓词:

def short_caption(someitem):
    return len(someitem) < 60

然后通过将其添加到'tests'字典中将其注册到环境中:

your_environment.tests["short_caption"] = short_caption

你可以像这样使用它:

{% if item[0] is short_caption %}
{# do something here #}
{% endif %}

有关详细信息,请参阅custom tests

上的jinja文档

(你只需要这样做一次,我认为无论你是在开始渲染模板之前还是之后都这样做,文档都不清楚)

如果您还没有使用环境,可以像这样实例化它:

import jinja2

environment = jinja2.Environment() # you can define characteristics here, like telling it to load templates, etc
environment.tests["short_caption"] = short_caption

然后通过get_string()方法加载模板:

template = environment.from_string("""your template text here""")
template.render(items=links).encode('utf-8')

最后,作为旁注,如果您使用文件加载器,它允许您进行文件继承,导入宏等。基本上,您只需保存现在的文件并告诉jinja目录是哪里的

答案 1 :(得分:6)

len未在jinja2中定义,您可以使用;

{% if item[0]|length < 60 %}

答案 2 :(得分:0)

Jinja2现在有一个 truncate 过滤器,可以帮你检查

truncate(s, length=255, killwords=False, end='...', leeway=None)

示例:

{{ "foo bar baz qux"|truncate(9) }}
    -> "foo..."

{{ "foo bar baz qux"|truncate(9, True) }}
    -> "foo ba..."

参考:http://jinja.pocoo.org/docs/2.9/templates/#truncate