动态注册模板的 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)
我有以下代码:
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)