动态注册模板的 Jinja2 过滤器

Jinja2 filters for dynamic registered templates

我有以下代码:

from app.utils.logic.template_filters import get_date_europe

env = Environment(
    loader=FileSystemLoader(template_dirs),
    autoescape=True,
    extensions=['jinja2.ext.i18n'],
)
env.install_null_translations()
env.filters['get_date_europe'] = get_date_europe

def render_from_text(text, **context):
    t = jinja2.Template(text)
    return t.render(**context)

并且我想添加一个自定义过滤器来执行特定的日期时间格式设置。 text 是存储为字符串的有效模板。 问题是当行 {{ some_object.created_at|get_date_europe }} 包含在模板中时,jinja 抛出异常 jinja2.exceptions.TemplateAssertionError: no filter named 'get_date_europe'

我在 render_from_text 的第一行设置了一个调试断点并调用了 env.filters,函数似乎在那里 'get_date_europe': <function get_date_europe at 0x10fca02f0>,。 如何让我的过滤器对神社可见?

P.S。使用 Django 1.9。

我的问题是我尝试使用 jinja2.Template(text),它在每次调用时都会创建新的环境实例,而不是 env.from_string(text)。此更改允许我在实际加载模板之前将过滤器传递给环境。 它的工作方式如下: __new__ 方法中的 jinja2.Template(text) 运行以下代码: env = get_spontaneous_environment( block_start_string, block_end_string, variable_start_string, variable_end_string, comment_start_string, comment_end_string, line_statement_prefix, line_comment_prefix, trim_blocks, lstrip_blocks, newline_sequence, keep_trailing_newline, frozenset(extensions), optimized, undefined, finalize, autoescape, None, 0, False, None)

创建新环境。可以将扩展传递给它,但是为日期格式编写扩展太复杂了。 所以,我的代码现在看起来是这样的: env = Environment( loader=FileSystemLoader(template_dirs), autoescape=True, extensions=['jinja2.ext.i18n'], ) env.filters['format_datetime_europe'] = format_datetime_europe def render_from_text(text, **context): t = env.from_string(text) return t.render(**context)