Python 如何从Jinja2 contextfilter访问For变量
我在Jinja2开发了一个基于以下过滤器(简化)的定制i18n系统: 例如,这允许我创建以下上下文:Python 如何从Jinja2 contextfilter访问For变量,python,templates,internationalization,filter,jinja2,Python,Templates,Internationalization,Filter,Jinja2,我在Jinja2开发了一个基于以下过滤器(简化)的定制i18n系统: 例如,这允许我创建以下上下文: context = { 'user': { 'name': 'Joel', 'locale': 'es' } 'greetings': { 'en': 'Hi {{user.name}}!', 'es': '¡Hola {{user.name}}!' } } 并在我的模板中这样使用它: {{ gre
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 %}
我可以做些什么来将新变量(user)添加到我在contextfilter中使用的上下文中吗?如果我想让它工作,我需要添加它的名称和值
非常感谢您的帮助。好的,我已经用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 %}
{% for user in list_of_users %}
{{ greetings[user.locale]|render(user=user) }}
{% endfor %}