Как сделать так, чтобы пользовательский тег Jinja выводился только один раз? - PullRequest
1 голос
/ 01 июля 2010

У меня есть пользовательский тег в Jinja2, который я хочу выводить что-то только при первом вызове.Скажем, у меня есть следующий шаблон:

1. {% only_once %}
2. {% only_once %}
3. {% only_once %}

Я хочу, чтобы вывод был:контекст шаблона, чтобы отслеживать, напечатал ли я уже что-то или нет.Вот пример кода, но так ли это?

class OnlyOnceExtension(Extension):
    tags = set(['only_once'])

    @contextfunction
    def parse(self, context, parser):
        if hasattr(context, 'my_flag') and context.my_flag:
            return Output("")
        else:
            return Output("I only get printed once!")

Это правильно?Я прочитал кое-что о контексте неизменным, так что это не будет работать?(см. http://jinja.pocoo.org/2/documentation/api и найдите неизменный)

Ответы [ 3 ]

5 голосов
/ 19 декабря 2012

Если вы хотите сделать это исключительно с Jinja, вы можете просто проверить переменную loop.index следующим образом:

{% for bar in bars %}
    {% if loop.index == 1 %}
        Print me once
    {% endif %}
    Print me every time
{% endfor %}
4 голосов
/ 28 июля 2010

Я предлагаю реализовать это в коде Python:

class OnlyOnce(object):
    def __init__(self, data):
        self.data = data
        self.printed = False

    def __str__(self):
        if self.printed is False:
            self.printed = True
            return self.data
        return ''

Создайте экземпляр OnlyOnce в своем коде Python и передайте его шаблону, а затем каждый раз, когда вы захотите его использовать, просто используйте {{ only_once }}.

Одна вещь, которую я замечаю о многих людях, использующих Джинджу, это то, что они хотят делать вещи в стиле Джанго, то есть писать расширения. Но выражения Jinja / importing / whats достаточно мощные, чтобы вам не приходилось использовать расширения для всего.

И да, использование вещи context.my_flag - плохая идея. Только шаблон может изменить контекст. EVER.

1 голос
/ 01 июля 2010

Я бы определил логическое значение и макрос и пошел бы оттуда. Вместо того, чтобы печатать переменную, вы печатаете результат макроса, который использует оператор if и логическое значение, чтобы решить, должен ли он печататься. Итак, вы получаете следующее:

{{ set was_printed = false }}
{% macro print_once(to_print) %}
    {% if was_printed is sameas false %}
        {{ to_print }}
        {% set was_printed = true %}
    {% endif %}
{% endmacro %}
1. {% print_once(only_once) %}
2. {% print_once(only_once) %}
3. {% print_once(only_once) %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...