Как получить доступ к переменной For из контекстного фильтра Jinja2 - PullRequest
1 голос
/ 09 ноября 2011

Я разработал собственную систему i18n в Jinja2 на основе следующего фильтра (упрощенно):

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

Могу ли я что-нибудь сделать, чтобы добавить новую переменнуюпользователь) в контекст, который я использую в contextfilter?Мне нужно добавить и его имя, и значение, если я хочу, чтобы он работал.

Большое спасибо за вашу помощь.

1 Ответ

2 голосов
/ 09 ноября 2011

Хорошо, я исправил это с помощью 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 %}
...