声明在Jinja中不起作用


问题内容

我正在更改现有的Web界面以查看ROBOT文档库,该库使用了Jinja(HTML内的Python)和HTML的混合体。我以前从未使用过Jinja或HTML,并且遇到了甚至无法使用简单测试用例的问题。当浏览器加载文档时,我希望保留文档的项目目录结构,以便于查找,因此,我想使用jinja创建dir结构。这是我正在使用的代码的片段:

{% extends "base.html" %}
{% block body %}
<div class="well" id="left">
  <ul class="list-group list-unstyled">
    {% set collection_list = [] %}
    {% for collection in data.hierarchy %}
      {% if collection.collection_id|string == data.collection_id|string %}
          {% do collection_list.append(collection.path) %}
      {% else %}
        {% for link in collection.path_chain %}
          <li>
          <label class="tree-toggler nav-header"
                 title="file path: {{collection.path}}">{{link}}</label>
          <ul class="list-group  tree collapse"
              id={{link}}>
              </ul>
        {% endfor %}
          </li>
      {% endif %}

…还有更多,但这是我遇到错误的地方。它将collection_list var设置为罚款,并且if语句起作用,但是当执行’do’语句时,它将失败并显示:

TemplateSyntaxError:遇到未知标签“ do”。
Jinja正在寻找以下标签:’elif’或’else’或’endif’。需要关闭的最里面的块是“ if”。

我不认为这是一个未封闭的循环,因为如果我将do语句替换为简单的测试print语句,则它会起作用。有人知道我在做什么错吗?


问题答案:

模板文档中

表达声明

如果加载了expression-statement扩展名,则存在一个称为的标记,该标记的do工作方式与常规变量expression({{ ... }})完全相同;除了不打印任何东西。这可以用来修改列表:

{% do navigation.append('a string') %}

您需要启用Expression语句扩展名才能起作用。

您没有显示如何加载Jinja2环境,但是加载扩展是通过classextensions参数进行的:Environment()

jinja_env = Environment(extensions=['jinja2.ext.do'])