如果在jinja2中分支

sha*_*har 9 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')
Run Code Online (Sandbox Code Playgroud)

Jef*_*ner 12

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

def short_caption(someitem):
    return len(someitem) < 60
Run Code Online (Sandbox Code Playgroud)

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

your_environment.tests["short_caption"] = short_caption
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

{% if item[0] is short_caption %}
{# do something here #}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅自定义测试的jinja文档

(你只需要这样做一次,我认为你在开始渲染模板之前或之后是否这样做很重要,文档不清楚)

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

import jinja2

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

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

template = environment.from_string("""your template text here""")
template.render(items=links).encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

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


Sha*_*est 6

len没有在jinja2中定义,你可以使用;

{% if item[0]|length < 60 %}
Run Code Online (Sandbox Code Playgroud)