为什么Jinja2无法将Python对象转换为字符串或整数

0 投票
1 回答
4898 浏览
提问于 2025-04-18 16:42

这是我最初的源代码。

{% extends "base.html" %}
{% block css %}
        {{ super() }}
                <link rel="stylesheet" type="text/css" href="/static/css/comic.css">
{% endblock %}

{% block content %}
<div id="comic">
        <div id="nav-container">
                {{ comic_path(int(panel_id) + 1) }}
                {{ str(int('3')) }}
                {{ int(panel_id) + 1 }}
                {{ int(panel_id) }}
                {{ isinstance(panel_id,basestring) }}
        </div>
        <img id="panel" src="{{ comic_path(panel_id) }}">
</div>
{% endblock %}

请注意 nav-container 这个 ID。所有那些 Python 代码块都尝试过,但都失败了,出现了一个 500 内部服务器错误 - 这是应用程序中的错误,而且日志里没有产生任何错误信息。

我没有其他相关的信息(问题确实只出现在那五个例子 {{ }} 的代码块上),但我可以回答任何问题来帮助我找出问题所在。

1 个回答

3

Jinja2 模板代码不是 Python 代码,而是类似 Python 的东西。因此,你只能使用在内置过滤器函数中列出的功能,还有你自己特别添加到模板引擎中的全局变量。

str() 这个函数不在列表里,isinstance() 也不在,可能 comic_path() 也不在。其实 str() 并不需要,因为 {{ ... }} 这种插值方式已经可以做到了,不过有一个string() 过滤器可以实现相同的功能。

一般来说,你会把已经处理过的数据传递给模板,包括 comic_path() 调用的结果。

有时候,把一个函数作为自定义过滤器或者作为新的全局变量添加是有好处的。如果你正在使用一个已经集成了 Jinja2 的网页框架,建议查看该框架的文档,看看是否提供了在其上下文中添加过滤器或全局变量的简单方法。

如果 comic_path() 已经是一个全局变量,那么 int 的使用方式会是:

{{ comic_path(panel_id|int + 1) }}

因为它是一个过滤器,而不是一个函数。

撰写回答