如何在Jinja2模板中重写/自定义(原生)对象的默认格式?

0 投票
2 回答
758 浏览
提问于 2025-04-17 20:42

我想改变Flask Admin中日期的默认显示方式,想给它设置一个特定的时区,并以更容易理解的格式展示出来。

有很多方法可以做到这一点,比如使用过滤器、__html____str__、Babel等等。虽然这些方法可能有效,但我想知道是否有一种更通用的方法来解决更普遍的问题。格式化日期这个具体问题只是一个例子。

在我的情况下,我无法控制日期对象——我不能去继承它或者修改它的__str____html__方法。我希望所有模板中的日期都能自动处理,而不想写自定义的管理模板,也不想在模板中使用显式的过滤器。

我理想的解决方案是以某种方式为Jinja指定一个默认过滤器,这样所有数据在展示之前都能通过这个过滤器。我可以自己写这个过滤器,但我不知道怎么让Jinja使用它。

我想到一个办法是以某种方式使用自动转义(可以参考这个问题),但我找不到不使用复杂的修改方法来覆盖Jinja的自动转义功能。

有没有什么想法?

2 个回答

1

如果你想在Flask-Admin相关的代码中实现这个功能,可以使用 column_type_formatters

https://flask-admin.readthedocs.org/en/latest/api/mod_model/#flask.ext.admin.model.BaseModelView.column_type_formatters

2

你不需要去修改任何东西。

你只需要为你的模型视图创建一个自定义的基础类,并在里面添加自定义的格式化器。下面是一个关于 date 类的例子:

from datetime import date
from flask_admin.model import typefmt


def date_format(view, value):
    return value.strftime('%d.%m.%Y')

MY_DEFAULT_FORMATTERS = dict(typefmt.BASE_FORMATTERS)
MY_DEFAULT_FORMATTERS.update({
    date: date_format,
})

class MyModelView(BaseModelView):
    column_type_formatters = MY_DEFAULT_FORMATTERS

撰写回答