我正在使用 Flaskjinja2 templating engine 构建一个网站,我正在动态构建菜单( as described here ):

{%
    set navigation_bar = [
        ('/', 'index', 'Home'),
        ('/aboutus/', 'aboutus', 'About Us'),
        ('/faq/', 'faq', 'FAQ')
    ]
%}

{% set active_page = active_page|default('index') -%}

<ul>
{% for href, id, title in navigation_bar %}
    <li{% if id == active_page %} class="active"{% endif %}>
        <a href="{{ href|e }}">{{ title|e }}</a>
    </li>
{% endfor %}
</ul>

现在,如果用户已登录,我想显示一些其他内容。所以在运行时我想将项目添加到 navigation_bar 变量中。我试过这样的事情:
{% if g.user.is_authenticated() %}
    {% navigation_bar.append(('/someotherpage', 'someotherpage', 'SomeOtherPage')) -%}
{% endif %}

但不幸的是,这会导致以下错误:TemplateSyntaxError: Encountered unknown tag 'navigation_bar'. Jinja was looking for the following tags: 'endblock'. The innermost block that needs to be closed is 'block'.
那么:有人知道我如何在运行时向 jinja2 变量添加其他项目吗?欢迎所有提示!

[奖金问题]
我也想知道, -{% set active_page = active_page|default('index') -%} 的末尾做了什么?

最佳答案

发生错误是因为 Jinja 无法识别块。每个 Jinja 区块都应该从区块名称开始。 do extension 中的 do 块满足您的需求。要使用它,您应该添加
对 jinja 扩展做扩展。你可以这样做:

app.jinja_env.add_extension('jinja2.ext.do')

然后你可以使用do扩展。您的示例应如下所示:
{% if g.user.is_authenticated() %}
    {% do navigation_bar.append(('/someotherpage', 'someotherpage', 'SomeOtherPage')) %}
{% endif %}

Here's 另一个简单的例子。

您会在 here 中找到奖金问题的答案。简而言之 - 从块的开头或结尾删除空格(这取决于它所在的位置)。

关于python - 如何在 Flask 中向 jinja 变量动态添加项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25938080/

10-13 01:33