【问题标题】:Do statement not working in jinjaDo 声明在 jinja 中不起作用
【发布时间】:2017-02-12 23:13:02
【问题描述】:

我正在更改现有的 Web 界面以查看 ROBOT 文档库,它混合使用了 jinja(HTML 中的 Python)和 HTML。我以前从未使用过 jinja 或 HTML,即使是简单的测试用例也无法正常工作。当浏览器加载文档时,我希望保留我们项目的文档目录结构,以便于查找,因此我想使用 jinja 创建目录结构。这是我正在使用的代码的 sn-p:

{% 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 语句,它就可以工作。有谁知道我做错了什么?

【问题讨论】:

  • 第一个问题是,Jinja 有'do' 语句吗?我问是因为 Python 没有,据我所知。
  • 应该是这样 - 我找到了诸如 '{% do navigation.append('a string') %}' 之类的示例,尽管它可能是版本/缺少扩展的东西?

标签: python html jinja2


【解决方案1】:

来自template documentation

表达式语句

如果加载了表达式语句扩展,则可以使用名为do 的标记,其工作方式与正则变量表达式 ({{ ... }}) 完全相同;除了它不打印任何东西。这可用于修改列表:

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

您需要启用Expression statement extension 才能使其工作。

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

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

【讨论】:

  • 啊,我明白了 - 我没有意识到它不包括在内。抱歉,我会追踪它在代码中的加载位置并添加扩展。
  • 要在 Flask 应用中加载此扩展,请在应用初始化期间在某处添加 app.jinja_env.add_extension('jinja2.ext.do')
  • 也许没有办法解决这个问题,但它会导致空格被吐出{% do navigation.append('a string') %} 它没有输出无,但我现在有很多换行符,我不想这样做有。
  • @Melendowski: Jinja 给你plenty of control over whitespace;使用{%- 代替{% 删除块前的空格,使用-%} 代替%} 将删除块后面的所有空格。
猜你喜欢
  • 2021-07-02
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2012-12-05
  • 2013-07-13
  • 1970-01-01
相关资源
最近更新 更多