Python 如何从Jinja2 contextfilter访问For变量

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

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

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

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 %}