我们可以在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')
答案 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..."