如何使用Bottle的SimpleTemplate引擎创建可在多个模板中使用的宏?

3 投票
1 回答
789 浏览
提问于 2025-04-16 22:27

我需要在我的Bottle应用程序中的某些地方格式化链接。之前,所有的链接都放在一个SimpleTemplate文件里,我定义了一个宏,长得像这样:

%def mylink(obj):
    <a class="mylink" href="{{ get_url('view', id=obj.id) }}">{{ obj.title }}</a>
%end

每当我需要格式化一个指向obj的链接时,我就用:

%mylink(some_obj)

现在我需要在多个模板中使用这种格式的链接。我把模板的定义移动到了一个叫macros.html的单独文件里,然后尝试用%include把这个文件引入到我需要宏的模板中:

<!-- macros.html -->
%def mylink(obj):
    <a class="mylink" href="{{ get_url('view', id=obj.id) }}">{{ obj.title }}</a>
%end

<!-- somepage.html -->
%include macros
...
%mylink(some_obj)
...

但是,Bottle无法在这样的布局中找到mylink这个名字。

我知道我可以这样做:

<!-- mylink.html -->
<a class="mylink" href="{{ get_url('view', id=obj.id) }}">{{ obj.title }}</a>

<!-- somepage.html -->
...
%include mylink obj=some_obj
...

不过,我不太想这样做,因为我觉得这样速度不太快(每个页面上我有很多链接需要格式化)。

我是不是漏掉了其他的选择?

1 个回答

0

%include 语句会立即显示被包含的模板。

也许你可以使用 %rebase 命令来解决这个问题,把你的宏放到基础模板里。

撰写回答