如何在Flask Jinja2模板中使用Python函数?

3
我会尽力进行翻译,以下是需要翻译的内容:

我正在使用 Flask Jinja2 模板将一个列表的列表发送到我的 HTML 页面。我想要检查:列表中的项是否为 str 类型?但是出现了以下异常:

jinja2.exceptions.UndefinedError: 'isinstance' is undefined

代码如下:

{% for i in req%}

    <tr>
        <th scope="row">{{loop.index}}</th>
        <td>{{i[1]}}</td>
        <td>{{i[24]}}</td>
        <td>{{i[49]}}</td>
        <td>{{i[53]}}</td>
        {% if isinstance(i[86], str) %}
            {% for j in i[86].split(",") %}
                <ol>
                    <li>{{i[86]}}</li>
                </ol>
            {% endfor %}
        {% else %}
            <td>{{i[86]}}</td>
        {% endif %}

    </tr>

    {% endfor %}

我能够使用 split(",") 函数,并希望在 jinja 2 模板中使用 python 的 isinstance()str()

尽管它看起来像Python,但实际上它是Jinja2语法,您只能使用内置的测试函数之一。任何不在这些列表中的内容都需要自己定义 - deceze
在@deceze的评论基础上,你也可以使用Flask来注册自定义Jinja2模板过滤器:https://flask.palletsprojects.com/en/1.1.x/templating/#registering-filters - vremes
2个回答

5
在jinja模板中使用的语言并非实际上的python,而是类似于python的语法。这意味着python内置函数不可用。为了使每个模板中都能使用python内置函数,在启动时,在构建jinja2.Environment时将任何需要的内置函数添加到globals参数中。示例如下:
app.jinja_env.globals.update(isinstance=isinstance)

或者

import jinja2
env = jinja2.Environment()
env.globals.update(isinstance:isinstance)

'app.jinja_env.globals.update(isinstance=isinstance)' 对我很有用。 我可以在那里注册更多的方法,比如 'app.jinja_env.globals.update(isinstance=isinstance, sorted=sorted)' 。但是出现了语法错误 'env.globals.update(isinstance:isinstance)' 的问题。 - raviraj
如果我理解正确的话,你说的soreted是指sorted吗?这是一个打字错误吗? - ngShravil.py
你可能会遇到需要导入类型以避免(TypeError: isinstance() arg 2 must be a type or tuple of types)的后续问题,请参考https://dev59.com/_G445IYBdhLWcg3wfKcZ。 - Wolfgang Fahl

0
另一个选项是使用Flask上下文处理器。例如,从Flask文档中,这里有一个上下文处理器,可以在应用程序中的所有模板中提供format_price函数:
app = Flask(__name__)

@app.context_processor
def utility_processor():
    def format_price(amount, currency="€"):
        return f"{amount:.2f}{currency}"
    return dict(format_price=format_price)

这个想法是你可以使用@app.context_processor修饰一个函数,然后它返回的字典会自动合并到所有模板的Jinja上下文中。

请注意,这甚至可以用于将整个模块add到模板上下文中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接