gpt4 book ai didi

python - 如何从 Jinja2 上下文过滤器访问 For 变量

转载 作者:行者123 更新时间:2023-12-01 06:05:41 27 4
gpt4 key购买 nike

我在 Jinja2 中基于以下过滤器(简化)开发了一个自定义 i18n 系统:

@contextfilter
def render(context, value):
"""
Renders the filtered value as a string template, using the context
and environment of the caller template.
"""
mini_template = _environment.from_string(value)
return mini_template.render(context)

例如,这允许我创建以下上下文:

context = {
'user': {
'name': 'Joel',
'locale': 'es'
}
'greetings': {
'en': 'Hi {{user.name}}!',
'es': '¡Hola {{user.name}}!'
}
}

并在我的模板中像这样使用它:

{{ greetings[user.locale]|render() }}

效果很好。

现在想象一下我有一组用户而不是单个用户。我在 Django 模板中执行了以下操作,但它在 Jinja2 中不起作用,因为变量“user”不在上下文中:

{% for user in list_of_users %}
{{ greetings[user.locale]|render() }}
{% endfor %}

我可以做些什么来将新变量(用户)添加到我在上下文过滤器中使用的上下文中吗?如果我想让它工作,我需要添加它的名称和值。

非常感谢您的帮助。

最佳答案

好吧,我已经使用 kwargs 修复了它(尽管它比 Django 模板中的等效项更冗长)。

过滤器:

@contextfilter
def render(context, value, **kwargs):
"""
Renders the filtered value as a string template, using the context
and environment of the caller template.
"""
if kwargs:
kwargs.update(context)
ctx = kwargs
else:
ctx = context

#we render the string as its own template
mini_template = _environment.from_string(value)
return mini_template.render(ctx)

用法:

{% for user in list_of_users %}
{{ greetings[user.locale]|render(user=user) }}
{% endfor %}

关于python - 如何从 Jinja2 上下文过滤器访问 For 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8056516/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com