如何在Flask的base.html中直接执行datetime日期格式化函数?
解决方案
完全可以直接在base.html中生成日期,不用在每个路由里重复传参,这里提供两种实用方法:
方法一:全局模板上下文处理器
在routes.py里添加一个上下文处理器,把格式化好的日期注入到所有模板中:
from datetime import datetime @app.context_processor def inject_current_date(): return {'current_date': datetime.today().strftime('%Y-%m-%d %H:%M')}
然后修改base.html的date块,直接调用这个全局变量:
{% block date %} {{ current_date }} {% endblock %}
这样所有继承base.html的子模板(比如start.html)都不用再单独传date参数,子模板甚至可以不用覆盖date块,直接继承base里的日期渲染逻辑。
方法二:将datetime模块注册到模板全局
如果你想直接在模板里写datetime.today().strftime(...),先在routes.py里把datetime模块注册到Jinja2的全局变量中:
from datetime import datetime app.jinja_env.globals['datetime'] = datetime
然后修改base.html的date块:
{% block date %} {{ datetime.today().strftime('%Y-%m-%d %H:%M') }} {% endblock %}
这种方式同样不需要在路由里传参,所有子模板都会自动渲染这个日期。
进阶优化:自定义日期过滤器
如果需要多种日期格式,可以自定义一个模板过滤器,灵活性更高:
@app.template_filter('format_date') def format_date(date, fmt='%Y-%m-%d %H:%M'): return date.strftime(fmt)
使用时可以直接调用默认格式:
{% block date %} {{ datetime.today()|format_date }} {% endblock %}
也可以指定自定义格式:
{{ datetime.today()|format_date('%Y年%m月%d日 %H:%M') }}
推荐第一种上下文处理器的方式,逻辑更清晰,后续修改格式也只需要改一处代码。
内容的提问来源于stack exchange,提问作者aNewDivide
相关产品推荐
相关产品推荐

